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

问题描述

(注意:关于“杰克逊抱怨无法识别的属性”的主题,我已经看到了多个问题的答案,但我还没有找到使用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);

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

@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;
          }          
          
        }
    ));