为ObjectMapper创建多个bean



我想为objectMapper创建多个bean,主要是在日期格式上区分。

我编写了以下代码 -

@Configuration
public class ObjectMapperConfig {
    @Primary
    @Bean
    public ObjectMapper createDefaultObjectMapper() {
        return new ObjectMapper();
    }
    @Bean(name="AOMapper")
    public ObjectMapper createFacebookObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZ"));
        return objectMapper;
    }
    @Bean(name="BOMapper")
    public ObjectMapper createTwitterObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setDateFormat(new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy"));
        return objectMapper;
    }
}

虽然我能够使用@qualifier注释使用AOMAPPER和BOMAPPER,但其他第三方软件包仅使用objectMapper而无需预选器注释,无法获得默认的ObjectMapper。

有出路吗?

更新:以下是例外,我得到

[com.myorg.service.xyz.client.XyzClient]: Factory method 'getUnstarted' threw exception; nested exception is java.lang.RuntimeException: java.io.UncheckedIOException: Cannot construct instance of `java.time.Instant` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('2018-03-19T22:56:33.339Z')
 at [Source: (ByteArrayInputStream); line: 1, column: 161] (through reference chain: com.myorg.service.xyz.client.WatchResult["updates"]->java.util.ArrayList[0]->com.myorg.service.xyz.client.Announcement["announceTime"]) (code 200)

我从上方了解的是,xyzclient并未获得正确的默认对象mapper,因此无法对日期格式进行挑选

问题是您的ObjectMapper不知道如何进行Instant类,您需要注册提供这些自定义序列化器/避难所的Jackson模块。该模块命名为jackson-datatype-jsr310,您可以(使用Maven时(将其导入:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.9.4</version>
</dependency>

然后,当您创建对象映射器时,必须注册JavaTimeModule模块。

objectMapper.registerModule(new JavaTimeModule());

因此您的方法应与:

相似
@Bean
@Primary
public ObjectMapper createDefaultObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new JavaTimeModule());
    return objectMapper;
}

您是否可以覆盖第三方库的豆子并设置适当的对象图。它是在第三方库中的各个地方还是在一个可重复使用的地方使用?如果整个地方都使用它,那么将每个豆子覆盖可能是不可行的。如果他们在一个地方使用它,您可能可以摆脱创建自己的@primary bean以覆盖其默认值的方法。

此外,从事物的外观看来,您似乎正在以给定格式发送这些第三方库的日期。您不能标准化您给这些库日期的格式吗?

最新更新