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

And*_*ejs 5 jackson rest-assured jackson-databind

(注:我已经看到关于“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");
}
Run Code Online (Sandbox Code Playgroud)

它之所以有效,是因为该类已注释,如下所示

@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
    public String login;
    public int id;
}
Run Code Online (Sandbox Code Playgroud)

但是,我想使用使用重载方法的替代方法as(),并在不使用注释的情况下传入我自己的映射器:

<T> T as(Class<T> cls, ObjectMapper mapper);
Run Code Online (Sandbox Code Playgroud)

但杰克逊的映射器不起作用:

@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");
}
Run Code Online (Sandbox Code Playgroud)

我如何定义并传递我自己的映射器?

And*_*ejs 6

有必要实现 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;
    });
}
Run Code Online (Sandbox Code Playgroud)

此外,您可以在 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;
          }          
          
        }
    ));
Run Code Online (Sandbox Code Playgroud)