问题描述
(注意:关于“杰克逊抱怨无法识别的属性”的主题,我已经看到了多个问题的答案,但我还没有找到使用RestAssured的对象映射器的人)
@Test
public void objectMappingrelyingOnClassAnnotation() {
User user = RestAssured.get("https://api.github.com/users/andrejss88")
.as(User.class); // must have 'jackson-databind' dependency
Assert.assertEquals(user.login,"andrejss88");
}
之所以有效,是因为该类已被注释,例如here:
@JsonIgnoreProperties(ignoreUnkNown = true)
public class User {
public String login;
public int id;
}
但是,我想使用另一种方法,即使用重载的as()
方法,并使用注释将我的映射器不带任何值传递给
<T> T as(Class<T> cls,ObjectMapper mapper);
但是杰克逊的映射器不起作用:
@Test
public void objectMappingUsingSpecifiedMapper() {
// Doesn't compile - Jackson's ObjectMapper != RestAssured's Mapper
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNowN_PROPERTIES,false);
AnotherUser user = RestAssured.get("https://api.github.com/users/andrejss88")
.as(AnotherUser.class,objectMapper);
Assert.assertEquals(user.login,"andrejss88");
}
如何定义和传递自己的映射器?
解决方法
有必要实现RestAssured的Mapper
接口,该接口在幕后仍然可以像下面这样使用Jackson的映射器:
@Test
public void objectMappingUsingSpecifiedMapper() {
AnotherUser user = RestAssured.get("https://api.github.com/users/andrejss88")
.as(AnotherUser.class,getMapper());
Assert.assertEquals(user.login,"andrejss88");
Assert.assertEquals(user.id,11834443);
}
// pre-Java8 way
private Jackson2Mapper getMapper() {
return new Jackson2Mapper(new Jackson2ObjectMapperFactory() {
@Override
public ObjectMapper create(Type type,String s) {
ObjectMapper om = new ObjectMapper().findAndRegisterModules();
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
return om;
}
});
}
// Java8+ way
private Jackson2Mapper getMapperLambda() {
return new Jackson2Mapper((type,s) -> {
ObjectMapper om = new ObjectMapper().findAndRegisterModules();
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
return om;
});
}
此外,您可以在RestAssured的全局配置中定义此映射器,如下所示:
(信用归Jason:https://groups.google.com/g/rest-assured/c/xi78ZMqlovU?pli=1)
RestAssured.config = RestAssuredConfig.config().objectMapperConfig(new ObjectMapperConfig().jackson2ObjectMapperFactory(
new Jackson2ObjectMapperFactory() {
@Override
public ObjectMapper create(Type cls,String charset) {
ObjectMapper om = new ObjectMapper().findAndRegisterModules();
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
return om;
}
}
));