【发布时间】:2016-10-15 06:59:33
【问题描述】:
我正在尝试调用返回这种形式的数据的非常简单的 json 网络服务:
{
"_embedded": {
"users": [{
"identifier": "1",
"firstName": "John",
"lastName": "Doe",
"_links": {
"self": {
"href": "http://localhost:8080/test/users/1"
}
}
},
{
"identifier": "2",
"firstName": "Paul",
"lastName": "Smith",
"_links": {
"self": {
"href": "http://localhost:8080/test/users/2"
}
}
}]
},
"_links": {
"self": {
"href": "http://localhost:8080/test/users"
}
},
"page": {
"size": 20,
"totalElements": 2,
"totalPages": 1,
"number": 0
}
}
如您所见,它非常简单。 我解析链接没有问题,我的 POJO 扩展了 ResourceSupport。 以下是它们的样子:
UsersJson(根元素)
public class UsersJson extends ResourceSupport {
private List<UserJson> users;
[... getters and setters ...]
}
UserJson
public class UserJson extends ResourceSupport {
private Long identifier;
private String firstName;
private String lastName;
[... getters and setters ...]
}
问题是我希望 jackson 和 spring 足够聪明,可以解析 _embedded 属性并填充我的 UsersJson.users 属性,但事实并非如此。
我尝试了在互联网上找到的各种方法,但唯一能正常工作的方法是创建一个新类作为 _embedded 包装器:
UsersJson(根元素)
public class UsersJson extends ResourceSupport {
@JsonProperty("_embedded")
private UsersEmbeddedListJson embedded;
[... getters and setters ...]
}
嵌入式“包装器”
public class UsersEmbeddedListJson extends ResourceSupport {
private List<UserJson> users;
[... getters and setters ...]
}
它有效,但我觉得它很丑。
虽然我认为 RestTemplate 的以下配置会起作用(尤其是当我在 Jackson2HalModule 中看到 EmbeddedMapper 时),但它没有:
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);
RestTemplate restTemplate = new RestTemplate(Collections.singletonList(converter));
ResponseEntity<UsersJson> result = restTemplate.getForEntity("http://localhost:8089/test/users", UsersJson.class, new HashMap<String, Object>());
System.out.println(result);
谁能告诉我我错过了什么?
【问题讨论】:
-
Jackson 默认不支持 HAL _embedded 链接。您的包装器看起来是个不错的方法。 Spring-HATEOAS @EnableHypermediaSupport注解也值得一看,不过我没用过,不知道有没有用。
标签: java json spring jackson spring-hateoas