JacksonObjectMapper VS Spring集成JsonToObjectTransformer()

2eafrhcq  于 2023-08-05  发布在  Spring
关注(0)|答案(2)|浏览(128)

我在这件事上卡住了,我想更好地澄清它
JacksonObjectMapper的默认行为是在任何Java字段中不能绑定的json属性前抛出异常。

// json to bind in java entity
{ "name":"mike", "surname":"parker", "age":19 }

// java entity
class Hero {

   String name;
   String surname;

}

// default mapper from Jackson
private final ObjectMapper objectMapper = new ObjectMapper();

// this will fail for Unrecognized field "age"
Hero spiderMan = objectMapper.readValue(json, Hero.class);

字符串
为了避免无法识别的字段异常,我应该配置JacksonMap器忽略属性

.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)


在API文档的另一边,我读到Spring Integration JsonToObjectTransformer()默认使用JsonObjectMapperProvider工厂来获取JacksonJSON-processor的示例。奇怪的事实是,即使两者都假设以相同的方式行事,似乎他们实际上并不这样做。JsonToObjectTransformer()允许无法识别的json属性“age”,并且不会抛出任何异常。没有其他Map器在上面声明,所以我希望使用默认的JacksonMap器。

// same json coming from inputChannel but no exception is thrown and binding will success
@Bean
@Transformer(inputChannel = "myInputChannel", outputChannel = "myOuputChannel")
    JsonToObjectTransformer jsonToObjectTransformerHero() {

    return new JsonToObjectTransformer(Hero.class);
}


是我误解了什么,还是他们实际上以不同的方式行事?

gudnpqoy

gudnpqoy1#

查看实际内部ObjectMapper的初始化方式。看起来它被预先配置为忽略未知属性:

public Jackson2JsonObjectMapper() {
    this.objectMapper = JsonMapper.builder()
            .configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false)
            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
            .build();
    registerWellKnownModulesIfAvailable();
}

字符串

bfnvny8b

bfnvny8b2#

如果使用Sping Boot 它有一些默认设置:

  • MapperFeature.DEFAULT_VIEW_INCLUSION
    *反序列化特性.FAIL_ON_UNKNOWN_PROPERTIES
  • SerializationFeature.WRITE_DATES_AS_TIMESTAMPS

所以它们的行为略有不同

相关问题