@Scope (ConfigurableBeanFactory.SCOPE_PROTOTYPE) - PullRequest
0 голосов
/ 04 августа 2020

Я обновляю форму пружины 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: я использую context.getBean с аргументами для инициализации моего bean-компонента

PS 2: I ' m сталкивается с этой проблемой при запуске приложения, даже если я не использую bean-компонент при запуске (я использую @Scope ("prototype") для инициализации bean-компонента всякий раз, когда он вызывается)

PS 3: Проблем с пружиной не было 4.3.3

1 Ответ

0 голосов
/ 04 августа 2020

Это может быть из-за открытой проблемы с версией Spring 5.xx -

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

Здесь говорится о проблеме, которая указана c до версий 5.xx.

Начиная со Spring 5.0 @Bean может возвращать значение null, и в результате определение bean-компонента остается в реестре, но значение не устанавливается автоматически. Однако, если есть другой bean-компонент того же типа, который не является нулевым, он не становится автоподключенным. Наверное, должно? Исключение из Spring не упоминает о существовании bean-компонента (нулевого или ненулевого).

Попробуйте пометить поля как необязательные, чтобы он не сработал при запуске.

@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 чтобы объявить, что аннотированный параметр или возвращаемое значение может быть пустым при некоторых обстоятельствах.

Таким образом, все, что необходимо, - это пометить параметры и возвращаемый тип как 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);
  }
...