#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();
}
}
Вопрос
- Есть ли способ заставить Quarkus работать в этом сценарии без компиляции всех зависимостей с помощью Quarkus?
- Можно ли написать расширение Quarkus, которое может помочь в внедрении зависимостей требуемых типов?
Спасибо.
Комментарии:
1. То, как вы описали код, также не должно работать в чистом виде весной. Я имею в виду, что должно быть какое-то место, где вы готовите необъявленные сорта яровой фасоли. Как это достигается?
2. Класс определяется как компонент как часть applicationContext.xml. Это может быть причиной того, что он автоматически подключается.
Ответ №1:
В quarkus конфигурация через XML не поддерживается, поэтому вам нужно будет создать метод производителя для создания OtherLevelOne
и OtherLevelTwo
компонентов
Комментарии:
1. Как упоминалось выше: Все было опробовано: Добавлен класс производителя как для OtherLevelOne, так и для OtherLevelTwo. Это помогло решить проблему неудовлетворенных зависимостей во время компиляции, и сборка прошла успешно. Но теперь мы столкнулись с исключением NullPointException во время выполнения, когда метод «вызов» OtherLevelOne попытался получить доступ к экземпляру «OtherLevelTwo». Так что, похоже, инъекции второго уровня не произошло. Возможно, Quarkus не поддерживает это (без некоторых изменений, таких как добавление beans.xml и аннотации @Component ко всем классам в банках зависимостей).
2. Привет @geoand, есть ли какой-либо другой способ, которым я могу добиться этого или вышеописанный подход должен был сработать?