【问题标题】:How to autowire by name instead of type [duplicate]如何按名称而不是类型自动装配[重复]
【发布时间】:2021-12-29 07:47:37
【问题描述】:

我知道我不是第一个遇到这个问题的人,但我正在努力在 Spring Boot 2.5.4 中创建多个相同类型的 bean。

我的配置:

@Configuration
public class MapperConfig {

    @Bean("yamlMapper")
    public ObjectMapper yamlMapper() {
        return new ObjectMapper(new YAMLFactory());
    }

    @Bean("jsonMapper")
    public ObjectMapper jsonMapper() {
        return new ObjectMapper();
    }

}

还有我的服务等级:

@Service
@RequiredArgsConstructor
public class MapperService {

    @Qualifier("jsonMapper")
    private final ObjectMapper jsonMapper;

    @Qualifier("yamlMapper")
    private final ObjectMapper yamlMapper;

}

错误如下:

No qualifying bean of type 'com.fasterxml.jackson.databind.ObjectMapper' available: expected single matching bean but found 2: yamlMapper,jsonMapper

我已经尝试了其他 SO 帖子和文档中建议的 @Bean、@Qualifier 等的各种组合,但我似乎无法找到一种通过名称而不是类型来使 Spring 自动装配的方法。任何帮助将不胜感激!

解决方案:

正如 Youssef 所指出的,不是 MapperService 找不到正确的 bean,而是 Spring Boot 的 MappingJackson2HttpMessageConverterConfiguration 类。我们无法为该类添加注释,因此需要在我们的配置中使用@Primary。

上下文加载正常,如下所示:

@Configuration
public class MapperConfig {

    @Bean
    public ObjectMapper yamlMapper() {
        return new ObjectMapper(new YAMLFactory());
    }

    @Bean
    @Primary
    public ObjectMapper jsonMapper() {
        return new ObjectMapper();
    }

}
@Service
@RequiredArgsConstructor
public class MapperService {

    @Autowired
    @Qualifier("jsonMapper")
    private final ObjectMapper jsonMapper;

    @Autowired
    @Qualifier("yamlMapper")
    private final ObjectMapper yamlMapper;

}

【问题讨论】:

  • 你可能输入了错误的@Qualifier 吗?
  • 抛弃lombok,自己编写一个构造函数,它的构造函数参数上有@Qualifier。接下来,ObjectMapper 也被 Spring(Boot)本身使用,因此您需要将 JSON 标记为 Primary(这也可能会破坏内容,因为这也会(部分)禁用 ObjectMapper 的自动配置)。跨度>
  • @sotiriosdelimanolis 你已经链接了错误的答案,它是关于stackoverflow.com/questions/46548750/… 之类的问题
  • @Youssef 确实,这个问题没有包含必要的细节。替换了重复项。

标签: java spring spring-boot javabeans spring-bean


【解决方案1】:

使用注解:

@Resource

https://www.baeldung.com/spring-annotations-resource-inject-autowire

您的服务:

@Service
public class MapperService {

    @Resource(name = "jsonMapper")
    private final ObjectMapper jsonMapper;

    @Resource(name = "yamlMapper")
    private final ObjectMapper yamlMapper;

}

【讨论】:

  • 感谢您的建议 - 不幸的是,仍然出现同样的错误,真的很奇怪......
  • @Liam:这有帮助吗:stackoverflow.com/questions/18711924/…
  • 是的,我看了那个,它似乎是同一个用例,但是当我使用该帖子中的解决方案时,它仍然不起作用
【解决方案2】:

您需要像这样将@Primary 注释添加到您的ObjectMapper bean 之一

@Primary
@Bean("jsonMapper")

因为如果您使用的是 Spring Boot,Jackson 在尝试自动配置时需要它:

Parameter 0 of method mappingJackson2HttpMessageConverter in org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration required a single bean, but 2 were found:

但也要注意@M.Deinum 的评论:也可能会破坏东西,因为这也会(部分)禁用 ObjectMapper 的自动配置

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多