为了了解春天的生态系统,我正在为各种零件建造一些玩具项目。
我有一个spring-boot-data-rest服务按预期工作(code here),我正在构建一个spring-boot和spring-hateoas客户端来访问它(code here)< / p>
但由于某种原因,我不明白客户端没有看到服务器的链接。
这就是服务所服务的JSON:
{
"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());
我正在使用Spring boot 1.4.0.BUILD-SNAPSHOT版本。
这是我的代码的问题还是某个地方的错误?任何想法如何解决它?
答案 0 :(得分:2)
您未启用对HAL的支持。您的服务器使用Spring Data REST,默认为uses HAL。另一方面,客户不知道HAL。您可以通过添加@EnableHypermediaSupport
:
@SpringBootApplication
@EnableHypermediaSupport(type = HypermediaType.HAL)
public class Application {
答案 1 :(得分:1)
正如@zeroflagL指出的那样,客户端不知道HAL。
解决方案更复杂,并在https://stackoverflow.com/a/23271778/932342处得出答案,将额外的HTTPMessageConverter注册到RestTemplate以处理&#34; application / hal + json&#34;内容。
RestTemplate rest = new RestTemplate();
//need to create a new message converter to handle hal+json
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.registerModule(new Jackson2HalModule());
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setSupportedMediaTypes(MediaType.parseMediaTypes("application/hal+json"));
converter.setObjectMapper(mapper);
//add the new converters to the restTemplate
//but make sure it is BEFORE the exististing converters
List<HttpMessageConverter<?>> converters = rest.getMessageConverters();
converters.add(0,converter);
rest.setMessageConverters(converters);