Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Boot自动配置的ObjectMapper加上额外的ObjectMapper_Java_Spring_Spring Boot_Jackson_Spring Web - Fatal编程技术网

Java Spring Boot自动配置的ObjectMapper加上额外的ObjectMapper

Java Spring Boot自动配置的ObjectMapper加上额外的ObjectMapper,java,spring,spring-boot,jackson,spring-web,Java,Spring,Spring Boot,Jackson,Spring Web,我们目前正在尝试使用spring自动配置实现JSON日志库,或者创建它的Jackson ObjectMapper。我们的目标是不重写类JacksonAutoConfiguration中的spring自动配置,这样日志库的客户机的每个定制都不会被禁用 spring的实际行为是基于bean的,我们的主要问题是,JacksonProperties对于我们来说是不可定制和重用的。如果我们实际添加第二个beanJacksonProperties,应用程序启动将失败,因为JacksonAutoConfigu

我们目前正在尝试使用spring自动配置实现JSON日志库,或者创建它的Jackson ObjectMapper。我们的目标是不重写类
JacksonAutoConfiguration
中的spring自动配置,这样日志库的客户机的每个定制都不会被禁用

spring的实际行为是基于bean的,我们的主要问题是,
JacksonProperties
对于我们来说是不可定制和重用的。如果我们实际添加第二个bean
JacksonProperties
,应用程序启动将失败,因为
JacksonAutoConfiguration.Jackson2ObjectMapperBuilderCustomizerConfiguration.class
将无法处理第二个bean。(弹簧防尘套内部未标注为
@Primary

所以我们所做的就是开始重新实现每个bean,比如构建器、定制器等等。但这不是很容易维护,因为它重复了框架代码

我们现在的问题是,是否有任何方法可以调整为jackson对象映射器bean创建数据源的方式。下面是创建数据源的一个示例

@Bean(name = "testDataSource")
@ConfigurationProperties(prefix = "test.datasource")
public HikariDataSource naeDataSource(DataSourceProperties testDataSourceProperties) {
    return testDataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
}
我们知道问题仍然是重写对象映射器会使其停用,但如果您注意应用程序上下文,则提供多个对象映射器实例会容易得多

或者有没有更简单或其他的方法我们到目前为止还没有找到

使用的版本: 弹簧防尘套2.0.5.1版本

更新

我完成了spring boot项目,对
spring boot自动配置
模块做了一些更改,还设置了一个小的演示项目。我不认为这是一种完美的方法,但通过这种更改,可以轻松地从配置属性初始化自己的对象映射器。例如,您现在可以轻松地为五个不同的rest模板和通过rest-API调用的客户端创建五个对象映射器

@ConfigurationProperties(prefix = "logging.jackson")
@Bean("loggingJacksonProperties")
public JacksonProperties loggingJacksonProperties() {
    return new JacksonProperties();
}

@Bean
public ObjectMapper secondObjectMapper(@Qualifier("loggingJacksonProperties") JacksonProperties loggingJacksonProperties) {
    return loggingJacksonProperties.initializeJackson2ObjectMapperBuilder().build();
}
比较叉:


演示项目:

我不清楚您到底想做什么——特别是我不了解创建数据源和ObjectMapper之间的联系——但是您是否考虑过不公开JSON日志库作为bean使用的
ObjectMapper
?为什么我们需要将对象映射器作为bean是因为我们希望每个用户都能自定义我们的库。它是一个共享库,如果一个用户希望在其日志输出中有空值,那么应该可以通过应用程序属性启用此功能,因为他从标准spring配置中知道这一点。对于我们来说,数据源的处理只是一个很好的例子,可以很容易地从属性创建bean。
ObjectMapper
可以通过属性定制,而
ObjectMapper
本身不是bean。是的,我明白你的意思。但是不可能重用已经实现的构建器中的
JacksonProperties
和自定义功能。还是我错了?至少我需要一个bean作为属性,这将导致重复的bean异常?示例项目的小更新:)