代码之家  ›  专栏  ›  技术社区  ›  jcoig

使用RepositoryRestResource-s和常规控制器对Spring REST HATEOAS中的根请求进行自定义响应

  •  29
  • jcoig  · 技术社区  · 10 年前

    假设我有两个存储库:

    @RepositoryRestResource(collectionResourceRel = "person", path = "person")
    public interface PersonRepository extends PagingAndSortingRepository<Person, Long> {
        List<Person> findByLastName(@Param("name") String name);
    }
    

    @RepositoryRestResource(collectionResourceRel = "person1", path = "person1")
    public interface PersonRepository1 extends PagingAndSortingRepository<Person1, Long> {
        List<Person1> findByLastName(@Param("name") String name);
    }
    

    具有一个常规控制器:

    @Controller
    public class HelloController {
        @RequestMapping("/hello")
        @ResponseBody
        public HttpEntity<Hello> hello(@RequestParam(value = "name", required = false, defaultValue = "World") String name) {
            Hello hello = new Hello(String.format("Hello, %s!", name));
            hello.add(linkTo(methodOn(HelloController.class).hello(name)).withSelfRel());
            return new ResponseEntity<>(hello, HttpStatus.OK);
        }
    }
    

    现在,对 http://localhost:8080/ 是:

    {
      "_links" : {
        "person" : {
          "href" : "http://localhost:8080/person{?page,size,sort}",
          "templated" : true
        },
        "person1" : {
          "href" : "http://localhost:8080/person1{?page,size,sort}",
          "templated" : true
        }
      }
    }
    

    但我想得到这样的东西:

    {
      "_links" : {
        "person" : {
          "href" : "http://localhost:8080/person{?page,size,sort}",
          "templated" : true
        },
        "person1" : {
          "href" : "http://localhost:8080/person1{?page,size,sort}",
          "templated" : true
        },
        "hello" : {
          "href" : "http://localhost:8080/hello?name=World"
        }
      }
    }
    
    2 回复  |  直到 10 年前
        1
  •  31
  •   Community CDub    8 年前
    @Component
    public class HelloResourceProcessor implements ResourceProcessor<RepositoryLinksResource> {
    
        @Override
        public RepositoryLinksResource process(RepositoryLinksResource resource) {
            resource.add(ControllerLinkBuilder.linkTo(HelloController.class).withRel("hello"));
            return resource;
        }
    }
    

    基于

        2
  •  1
  •   Community CDub    8 年前

    您需要将Person资源的ResourceProcessory注册为Bean。看见 https://stackoverflow.com/a/24660635/442773