Spring boot Spring hateoas客户端与Spring引导数据rest不兼容?
为了了解spring生态系统,我正在varios部件上构建一些玩具项目 我已经有了一个spring boot数据rest服务,它按预期工作(),我正在构建一个spring boot和spring hateoas客户端来访问它() 但是由于某些原因,我不明白客户端没有看到服务器的链接 这就是服务提供的JSON的样子:Spring boot Spring hateoas客户端与Spring引导数据rest不兼容?,spring-boot,spring-hateoas,Spring Boot,Spring Hateoas,为了了解spring生态系统,我正在varios部件上构建一些玩具项目 我已经有了一个spring boot数据rest服务,它按预期工作(),我正在构建一个spring boot和spring hateoas客户端来访问它() 但是由于某些原因,我不明白客户端没有看到服务器的链接 这就是服务提供的JSON的样子: { "firstName": "Alice", "lastName": "Foo", "_links": { "self": {
{
"firstName": "Alice",
"lastName": "Foo",
"_links": {
"self": {
"href": "http://localhost:8080/people/1"
},
"person": {
"href": "http://localhost:8080/people/1"
}
}
}
这是客户端用于查询服务的代码:
//now use a GET to get it back
ResponseEntity<Resource<Person>> getResult = rest.exchange(
"http://localhost:8080/people/1", HttpMethod.GET, null,
new ParameterizedTypeReference<Resource<Person>>() {
});
//check the links on the response
log.info("getResult "+getResult);
log.info("getResult.getBody"+getResult.getBody());
//uh oh, no links...
log.info("getResult.getLink(\"self\")"+getResult.getBody().getLink("self"));
log.info("getResult.getLink(\"self\").getHref()"+getResult.getBody().getLink("self").getHref());
//现在使用GET将其取回
ResponseEntity getResult=rest.exchange(
"http://localhost:8080/people/1,HttpMethod.GET,null,
新的ParameteredTypeReference(){
});
//检查响应上的链接
log.info(“getResult”+getResult);
log.info(“getResult.getBody”+getResult.getBody());
//哦,没有链接。。。
log.info(“getResult.getLink(\“self\”)+getResult.getBody().getLink(“self”);
log.info(“getResult.getLink(\“self\”).getHref()”+getResult.getBody().getLink(“self”).getHref());
我使用的是SpringBoot1.4.0.BUILD-SNAPSHOT版本
这是我的代码的问题还是某个地方的bug?有没有办法修复它?您没有启用对HAL的支持。您的服务器使用SpringDataREST,这是默认的。另一方面,客户对哈尔一无所知。您可以通过添加
@EnableHypermediaSupport
来添加支持:
@SpringBootApplication
@EnableHypermediaSupport(type = HypermediaType.HAL)
public class Application {
您没有启用对HAL的支持。您的服务器使用SpringDataREST,这是默认的。另一方面,客户对哈尔一无所知。您可以通过添加
@EnableHypermediaSupport
来添加支持:
@SpringBootApplication
@EnableHypermediaSupport(type = HypermediaType.HAL)
public class Application {
正如@zeroplagl所指出的,客户根本不知道哈尔 该解决方案更为复杂,它利用上的答案向RestTemplate注册一个额外的HTTPMessageConverter来处理“application/hal+json”内容
RestTemplate rest=new RestTemplate();
//需要创建一个新的消息转换器来处理hal+json
ObjectMapper mapper=新的ObjectMapper();
configure(在未知属性上反序列化feature.FAIL,false);
registerModule(新Jackson2HalModule());
MappingJackson2HttpMessageConverter=新的MappingJackson2HttpMessageConverter();
setSupportedMediaTypes(MediaType.parseMediaTypes(“application/hal+json”);
setObjectMapper(映射器);
//将新转换器添加到restTemplate
//但要确保它在现有转换器之前
正如@zeroflagL所指出的,客户对HAL一无所知
该解决方案更为复杂,它利用上的答案向RestTemplate注册一个额外的HTTPMessageConverter来处理“application/hal+json”内容
RestTemplate rest=new RestTemplate();
//需要创建一个新的消息转换器来处理hal+json
ObjectMapper mapper=新的ObjectMapper();
configure(在未知属性上反序列化feature.FAIL,false);
registerModule(新Jackson2HalModule());
MappingJackson2HttpMessageConverter=新的MappingJackson2HttpMessageConverter();
setSupportedMediaTypes(MediaType.parseMediaTypes(“application/hal+json”);
setObjectMapper(映射器);
//将新转换器添加到restTemplate
//但要确保它在现有转换器之前
list谢谢你的回答,但不幸的是它对我不起作用-我认为注释是用于服务器的?不管怎样,这确实让我走上了解决问题的轨道!谢谢你的回答,但不幸的是它对我不起作用-我想注释是在服务器上使用的?不管怎样,这确实让我走上了解决问题的轨道!第一部分是添加@EnableHypermediaSupport
时发生的基本情况。但这并不影响RestTemplate,只影响SpringMVC。不幸的是,你是对的,你必须自己去做。第一部分基本上是当你添加@EnableHypermediaSupport
时会发生什么。但这并不影响RestTemplate,只影响SpringMVC。不幸的是,你是对的,你必须自己去做。