IntelliJ Idea помечает bean-компонент как невозможный автоматический вывод ошибки для аргумента, но код работает - PullRequest
0 голосов
/ 01 октября 2018

В моем проекте есть следующие классы и конфигурации:

public class Op {       
    public Op(Comp comp) {
        // Construct Op
    }
}

public interface OpFactory {       
    public Op createOp(Comp comp);
}

и конфигурация Spring:

@Configuration
public class OpConfig {

    @Bean
    @Scope(SCOPE_PROTOTYPE)
    Op op(Comp comp) {      // <--- Intellij marks this as error
        return new Op(composition);
    }

    @Bean
    OpFactory opFactory() {
        return new OpFactory() {
            @Override
            public Op createOp(Comp comp) {
                return op(comp);
            }
        };
    }

}

Этот код работает, однако IntelliJ IDEA показывает ошибку в конфигурациис указанием Could not autowire. No beans of 'Comp' type found..Сам Comp - это pojo, и его не нужно подключать автоматически, и, как вы можете видеть, фабрика поставляет Optor с ним.

Код работает, просто IntelliJ это не нравится.Я обычно слушаю IntelliJ и не хочу просто подавить это с помощью @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection"), есть ли лучший способ настроить бины, и у IntelliJ есть смысл?

Дайте мне знать, если есть больше информации и /или код, который я могу предоставить.

Редактировать:

Та же ошибка возникает, когда я опускаю фабричный бин и использую BeanFactory#getBean(String name, Object... args), как предложено в этом ответе .Фабричный подход в основном такой же, только чтобы избежать дополнительных вызовов на BeanFactory#getBean(String name, Object... args).

Кроме того, мне не нужно Comp для автоматической проводки, потому что, как только у меня есть фабрика, яможет просто передать его, и, как я уже сказал, сам комп это pojo.Пример использования:

Comp comp = new Comp();
OpFactory opFactory = getFactoryFromContext();
opFactory.createOp(comp);

Мне не нужно, чтобы comp был автоматически подключен, фактически я не могу включить его автоматически, так как я строю его на основе пользовательского ввода во время выполнения.

1 Ответ

0 голосов
/ 01 октября 2018

Ну, то, что говорит IntelliJ, верно, поскольку вы признаете, что ваш Comp - это просто pojo, и вы не подключили его автоматически.поэтому ошибка верна, когда Spring пытается инициализировать Bean of Op в соответствии с

@Bean
@Scope(SCOPE_PROTOTYPE)
Op op(Comp comp) {      // <--- Intellij marks this as error
    return new Op(composition);
}

Очевидно, что у вас нет Comp bean.Так что ошибка верна.

Но на вопрос, почему это действительно работает, на самом деле, поскольку spring не может инициализировать bean-компонент, он просто пропускает его, а затем происходит что-то вроде этого,

Op op(Comp comp) {     
    return new Op(composition);
}

@Bean
OpFactory opFactory() {
    return new OpFactory() {
        @Override
        public Op createOp(Comp comp) {
            return op(comp);
        }
    };
}

Так почему бы не работать?: D Основная проблема заключается в вашем использовании, если у вас есть фабрика, возвращающая какие-либо объекты, она не может вернуть ни одного компонента.Бин сам по себе синглтон, и здесь ваши конфиги должны быть изменены соответствующим образом.Поэтому я думаю, вам нужно что-то вроде выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...