gpt4 book ai didi

jackson - RestAssured - 无法识别的字段,未标记为可忽略

转载 作者:行者123 更新时间:2023-12-05 03:48:55 24 4
gpt4 key购买 nike

(注意:我已经看到多个关于“Jackson 提示无法识别的属性”主题的问题得到了回答,但我没有找到专门使用 RestAssured 的对象映射器的问题)

我有一个 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);

但是 Jackson 的映射器不起作用:

@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 接口(interface),在底层,它仍然可以像这样使用 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 的全局配置中定义此映射器:

(归功于杰森: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;
}

}
));

关于jackson - RestAssured - 无法识别的字段,未标记为可忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64167768/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com