0

我正在将 spring form 4.3.3 升级到 5.2.7,但我遇到了这个例外:

例外:

Related cause: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'MyBean' defined in com.test: Unsatisfied dependency expressed through method 'MyBean' parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.lang.String' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} 

代码 :

@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@SuppressWarnings({ "unchecked" })
public MyBean MyBean(String url,
        String user, String password, String id) {
    return MyBean(url, user, password, id,
            new HashMap<String, String>(),false); 
}

PS 1:我正在使用带有 args 的 context.getBean 来初始化我的 bean

PS 2:我在应用程序启动时遇到了这个问题,即使我在启动时没有使用 bean(我正在使用 @Scope("prototype") 来初始化 bean 每当它被调用)

PS 3:我对 spring 4.3.3 没有问题

4

1 回答 1

0

这可能是由于 Spring 5.xx 版本存在一个未解决的问题 -

https://github.com/spring-projects/spring-framework/issues/21498

它讨论了特定于 5.xx 版本的问题。

从 Spring 5.0 开始,@Bean 可以返回 null,其效果是将 bean 定义保留在注册表中,但使值不可自动装配。但是,如果有另一个相同类型的 bean 不为 null,则它不会变为可自动装配的。应该是吧?Spring的异常没有提到任何一个bean的存在(null或not null)

尝试将这些字段标记为可选,这样它就不会在启动时失败。

@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@SuppressWarnings({ "unchecked" })
public Optional<MyBean> MyBean(Optional<String> url,
        Optional<String> user, Optional<String> password, Optional<String> id) {
    if(url.isEmpty() && user.isEmpty() && password.isEmpty() && id.isEmpty()) {
     return Optional.empty();
    } 
    return Optional.of(new MyBean(url, user, password, id,
            new HashMap<String, String>(),false)); 
}

更新 1

我认为这是更容易的解决方案。Spring 5.0 添加了 Nullable 注释,可能他们只为这种场景添加了这个注释。

API 文档链接 - https://docs.spring.io/spring/docs/5.0.0.RC1_to_5.0.0.RC2/Spring%20Framework%205.0.0.RC2/org/springframework/lang/Nullable.html

一个常见的 Spring 注释,用于声明带注释的参数或返回值在某些情况下可能为 null。

因此,只需将参数和返回类型标记为 Nullable。

  @Bean
  @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
  @SuppressWarnings({ "unchecked" })
  public @Nullable MyBean myBean(@Nullable String url,
                                 @Nullable String user, @Nullable String password, @Nullable String id) {
    if(url == null && user == null && password == null && id == null) {
      return null;
    }
    return new MyBean(url, user, password, id,
            new HashMap<String, String>(),false);
  }
于 2020-08-04T14:31:18.567 回答