我的实体:
public class User {
private Integer id;
private String mail;
private boolean enabled;
// getters and setters
}
文件 test.json(来自 REST web 服务的响应):
{
"_embedded" : {
"users" : [ {
"id" : 1,
"mail" : "admin@admin.com",
"enabled" : true,
"_links" : {
"self" : {
"href" : "http://localhost:8080/api/users/1"
}
}
} ]
}
}
我的测试类:
public class TestJson {
private InputStream is;
private ObjectMapper mapper;
@Before
public void before() {
mapper = new ObjectMapper();
mapper.registerModule(new Jackson2HalModule());
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
is = TestJson.class.getResourceAsStream("/test.json");
}
@After
public void after() throws IOException {
is.close();
}
@Test
public void test() throws IOException {
PagedResources<Resource<User>> paged = mapper.readValue(is, new TypeReference<PagedResources<Resource<User>>>() {});
Assert.assertNotNull(paged.getContent().iterator().next().getContent().getId());
}
@Test
public void testResource() throws IOException {
PagedResources<User> paged = mapper.readValue(is, new TypeReference<PagedResources<User>>() {});
Assert.assertNotNull(paged.getContent().iterator().next().getId());
}
}
第二个测试通过了,但第一个测试失败了。我不明白为什么,因为用户中的 ID 属性是唯一缺失的(邮件和启用属性不为空)...
我需要怎么做才能修复它?这是 Jackson 或 Spring Jackson2HalModule 的错误吗?
您可以克隆我的 spring-hateoas 分支库repository并启动单元测试来复现此问题。
spring-hateoas
和spring-boot
一样的问题,所以我不得不将id
重命名为其他名称。 - cahenobjectMapper.addMixIn(Resource.class, IdResourceSupportMixIn.class);
- 适用于jackson 2.8.8和spring-hateoas 0.28以及rest template。但它会破坏response.getBody().getId()
。 - František Hartmanpublic abstract class IdResourceSupportMixin extends ResourceSupport { @Override @JsonIgnore(false) public abstract Link getId(); @Override @XmlElement(name = "link") @JsonProperty("_links") @JsonInclude(JsonInclude.Include.NON_EMPTY) @JsonSerialize(using = Jackson2HalModule.HalLinkListSerializer.class) @JsonDeserialize(using = Jackson2HalModule.HalLinkListDeserializer.class) public abstract List getLinks(); }
- hurelhuyag