【问题标题】:Spring boot two object mapper beanSpring Boot 两个对象映射器 bean
【发布时间】:2017-10-03 15:55:41
【问题描述】:

我想在我的 Spring boot 项目中创建两个 Hibernate 感知对象映射器 bean。

一个 bean 强制延迟加载,另一个强制延迟加载设置为 false。我的 bean 定义如下:

我创建了一个HibernateAwareObjectMapper 类

public class HibernateAwareObjectMapper extends ObjectMapper {
}

和

@Configuration
public class CrewuiserCorebeans extends WebMvcConfigurerAdapter {

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

@Bean
public ObjectMapper defaultObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    Hibernate5Module hibernate5Module = new Hibernate5Module();
    hibernate5Module.configure(Hibernate5Module.Feature.FORCE_LAZY_LOADING, true);
    objectMapper.registerModule(hibernate5Module);
    return objectMapper;
}

@Bean
public HibernateAwareObjectMapper hibernateAwareObjectMapper() {
    HibernateAwareObjectMapper objectMapper = new HibernateAwareObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    Hibernate5Module hibernate5Module = new Hibernate5Module();
    hibernate5Module.configure(Hibernate5Module.Feature.FORCE_LAZY_LOADING, false);
    objectMapper.registerModule(hibernate5Module);
    return objectMapper;
}


@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    argumentResolvers.add(new UserContextResolver());
}

}

当我运行应用程序时,出现以下错误:

Parameter 0 of method mappingJackson2HttpMessageConverter in org.springframework.boot.autoconfigure.web.JacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration required a single bean, but 2 were found:
- defaultObjectMapper: defined by method 'defaultObjectMapper' in class path resource [com/crewuiser/core/configuration/CrewuiserCorebeans.class]
- hibernateAwareObjectMapper: defined by method 'hibernateAwareObjectMapper' in class path resource [com/crewuiser/core/configuration/CrewuiserCorebeans.class]

org.springframework.boot.autoconfigure.web.JacksonHttpMessageConvertersConfiguration 在 jar 中,所以我无法添加 @Qualifier 注释。

如果我在这里遗漏了什么,请帮忙。我怎样才能使它工作?

【问题讨论】:

    标签: spring spring-boot


    【解决方案1】:

    我找到了解决方案。

    我将@Primary 添加到其中一个bean 中,并在我的其他非主bean 需要@Autowired 的类中使用@Qualifier。

    @Bean
    @Primary
    public ObjectMapper defaultObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        return objectMapper;
    }
    

    在我的服务类中。

    @Autowired
    public OrganisationService(OrganisationValidator organisationValidator, OrganisationAuthority organisationAuthority,
                               OrganisationHelper organisationHelper, OrganisationRepository organisationRepository,
                               @Qualifier("hibernateAwareObjectMapper") ObjectMapper hibernateAwareObjectMapper) {}
    

    【讨论】:

    • 值得注意的是,默认情况下,Spring 将使用返回 bean 的方法名称作为限定符,但您也可以通过使用 @Bean 方法注释 @Qualifier 然后指定您想用作注释参数的限定符。
    【解决方案2】:

    在不同情况下使用不同参数/配置的另一种方法是从 ObjectMapper 创建一个 ObjectReader,并通过自定义覆盖 ObjectMapper 配置。例如objectMapper.readerFor(YourClass.class).with(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)

    从这里得到这个想法:https://stackoverflow.com/a/58294093/345648

    这不一定是最好的方法,具体取决于您的用例。也请查看 anunaki 的答案。

    【讨论】:

      【解决方案3】:

      您可以为 bean 命名如下:

      @Bean("bean1")
      public ObjectMapper defaultObjectMapper() {
      .......
      }
      
      @Bean("bean2")
      public HibernateAwareObjectMapper hibernateAwareObjectMapper() {
      .....    
      }
      

      在您想要自动装配的位置使用 @Qualifier("bean1") 表示 bean1 或使用 @Qualifier("bean2") 表示 bean2。

      【讨论】:

      • 一开始,这个注解重新定义了名字(不给)。在您的情况下,从“defaultObjectMapper”到“bean1” 其次,问题的作者不能使用@Qualifier 注释。
      猜你喜欢
      • 2017-02-17
      • 2020-06-23
      • 2020-11-17
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多