Я пытаюсь запустить очень простые json webservices, которые возвращают данные этой формы:
{
"_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. Вот как они выглядят:
ПользователиJson (корневой элемент)
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, но это не так.
Я пробовал различные вещи, которые я нашел в Интернете, но единственное, что я мог бы нормально работать, это создать новый класс, действующий как обернутая оболочка:
ПользователиJson (корневой элемент)
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 работала бы (особенно, когда я видел EmbeddedMapper в Jackson2HalModule), но это не так:
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);
Может ли кто-нибудь сказать мне, что мне не хватает?