CDI с не кварковыми пружинными банками

#quarkus

Вопрос:

Мы пытаемся перенести наше приложение с Spring на Quarkus Spring. Мы можем переписать логику нашего приложения по мере необходимости. Проблема возникает, когда мы используем общие весенние банки, которые являются устаревшими, и их много. Большинство банок spring используют инъекцию зависимостей с использованием @Autowired, но соответствующий класс, который вводится, не имеет аннотаций @Component.

Опишу проблему на примере:

Класс «MyProject» относится к приложению Quarkus

 public class MyProject {
    
    @Autowired
    private OtherLevelOne otherLevelOne;

    public void invokeMe() {
        this.otherLevelOne.call();
    }
}
 

Класс OtherLevelOne и OtherLevelTwo принадлежат к весенней банке зависимостей.

 public class OtherLevelOne {
    
    @Autowired
    private OtherLevelTwo otherLevelTwo;

    

public void call() {
        this.otherLevelTwo.otherCall();
    }
}

public class OtherLevelTwo {
    
    public void otherCall() {
        
    }
}
 

Возникшая Проблема.

 During compilation of Quakrus Application we get error:
 
 [ERROR] Failed to execute goal io.quarkus.platform:quarkus-maven-plugin:2.1.3.Final:build (quarkus-app-build) on project service-quarkus: Failed to build quarkus application: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[ERROR]     [error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: javax.enterprise.inject.spi.DeploymentException: Found 2 deployment problems:
[ERROR] [1] Unsatisfied dependency for type OtherLevelOne and qualifiers [@Default]
 

Кое-что попробовал: Добавил класс производителя как для OtherLevelOne, так и для OtherLevelTwo. Это помогло решить проблему неудовлетворенных зависимостей во время компиляции, и сборка прошла успешно. Но теперь мы столкнулись с исключением NullPointException во время выполнения, когда метод «вызов» OtherLevelOne попытался получить доступ к экземпляру «OtherLevelTwo». Так что, похоже, инъекции второго уровня не произошло. Возможно, Quarkus не поддерживает это (без некоторых изменений, таких как добавление beans.xml и аннотации @Component ко всем классам в банках зависимостей).

 @Dependent
public class ProducerClass {

    @Produces
    public OtherLevelOne createOtherLevelOne() {
        return new OtherLevelOne();
    }

    @Produces
    public OtherLevelTwo createOtherLevelTwo(){
        return new OtherLevelTwo();
    }
}
 

Вопрос

  1. Есть ли способ заставить Quarkus работать в этом сценарии без компиляции всех зависимостей с помощью Quarkus?
  2. Можно ли написать расширение Quarkus, которое может помочь в внедрении зависимостей требуемых типов?

Спасибо.

Комментарии:

1. То, как вы описали код, также не должно работать в чистом виде весной. Я имею в виду, что должно быть какое-то место, где вы готовите необъявленные сорта яровой фасоли. Как это достигается?

2. Класс определяется как компонент как часть applicationContext.xml. Это может быть причиной того, что он автоматически подключается.

Ответ №1:

В quarkus конфигурация через XML не поддерживается, поэтому вам нужно будет создать метод производителя для создания OtherLevelOne и OtherLevelTwo компонентов

Комментарии:

1. Как упоминалось выше: Все было опробовано: Добавлен класс производителя как для OtherLevelOne, так и для OtherLevelTwo. Это помогло решить проблему неудовлетворенных зависимостей во время компиляции, и сборка прошла успешно. Но теперь мы столкнулись с исключением NullPointException во время выполнения, когда метод «вызов» OtherLevelOne попытался получить доступ к экземпляру «OtherLevelTwo». Так что, похоже, инъекции второго уровня не произошло. Возможно, Quarkus не поддерживает это (без некоторых изменений, таких как добавление beans.xml и аннотации @Component ко всем классам в банках зависимостей).

2. Привет @geoand, есть ли какой-либо другой способ, которым я могу добиться этого или вышеописанный подход должен был сработать?