调用spring数据rest存储库方法不会返回链接

时间:2016-03-31 14:15:00

标签: java spring spring-data-rest spring-hateoas

我有存储库" ClientRepository":

public interface ClientRepository extends PagingAndSortingRepository<Client, Long> {
}

当我请求http://localhost:8080/clients/1时,服务器响应

{
  "algorithmId" : 1,
  "lastNameTxt" : "***",
  "firstNameTxt" : "**",
  "middleNameTxt" : "**",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/clients/1121495168"
    },
    "client" : {
      "href" : "http://localhost:8080/clients/1121495168"
    }
  }
}

响应有预期的链接。

当我在另一个控制器中调用存储库继承方法findOne时

@RestController
public class SearchRestController {

    @Autowired
        public SearchRestController(ClientRepository clientRepository) {
            this.clientRepository = clientRepository;
    }

    @RequestMapping(value = "/search", method = RequestMethod.GET)
        Client readAgreement(@RequestParam(value = "query") String query,
                @RequestParam(value = "category") String category) {
    return clientRepository.findOne(Long.parseLong(query));
    }
}

它回应

{
      "algorithmId" : 1,
      "lastNameTxt" : "***",
      "firstNameTxt" : "**",
      "middleNameTxt" : "**"
}

为什么没有响应包含第二种情况下的链接?如何让Spring将它们添加到响应中?

2 个答案:

答案 0 :(得分:4)

  

为什么没有回复包含第二种情况的链接?

因为Spring返回你告诉它返回的内容:一个客户端。

  

如何让Spring将它们添加到响应中?

在您的控制器方法中,您必须构建Resource&lt;客户端&gt;并将其归还。

根据您的代码,以下内容可为您提供所需内容:

datafamilies

从此加紧,我还建议你:

  • 使用 / clients / search 而不是 / search ,因为您搜索客户端(对RESTful服务更有意义)
  • 使用RepositoryRestController,原因是here

那应该给你一些:

@RequestMapping(value = "/search", method = RequestMethod.GET)
Client readAgreement(@RequestParam(value = "query") String query,
                     @RequestParam(value = "category") String category) {
    Client client = clientRepository.findOne(Long.parseLong(query));
    BasicLinkBuilder builder = BasicLinkBuilder.linkToCurrentMapping()
                                               .slash("clients")
                                               .slash(client.getId());
    return new Resource<>(client,
                          builder.withSelfRel(),
                          builder.withRel("client"));
}

答案 1 :(得分:3)

HATEOAS功能仅适用于使用@RepositoryRestResource注释的Spring数据jpa存储库。这会自动公开其余端点并添加链接。

当您在控制器中使用存储库时,您只需获取对象,杰克逊映射器将其映射到json。

如果要在使用Spring MVC控制器时添加链接,请查看here