Проверка времени сборки веб-сокетов ClientEndpoint в Quarkus - PullRequest
1 голос
/ 30 апреля 2020

Я использую Java WebSocket API для объявления клиента (класс Java, аннотированный @ClientEndpoint):

@ClientEndpoint
public class MySock {
    MySock(ExecutorService exec){}
    ...
}

Экземпляр создается с помощью конструктора:

webSocket = new MySock(exec);
session = wsContainer.connectToServer(webSocket, url);

И я ошибка при сборке через quarkus-maven-plugin:

[error]: Build step ...ArcProcessor#validate threw an exception: 
javax.enterprise.inject.UnsatisfiedResolutionException:
Unsatisfied dependency for type ...ExecutorService and qualifiers [@Default]
- java member: edu.MySock#<init>()
- declared on CLASS bean [types=[edu.MySock, java.lang.Object], qualifiers=[@Default, @Any], target=edu.MySock]

Обратите внимание: аннотации @Inject нет

Должна ли она быть проверена, если она может быть передан в #connectToServer как класс и как экземпляр?

Итак, нормально ли, если валидация обрабатывает случай pessimisti c, где валидация полезна, но она нарушает случай optimisti c?

Pessimisti c случай, когда зависимости не могут быть объявлены:

session = wsContainer.connectToServer(MySock.class, url);

В следующем случае проверка вредна, поскольку она нарушает фазу сборки:

session = wsContainer.connectToServer(webSocket, url);

Может быть, ClientEndpoint вообще не должен проверяться?


И прежде чем вы спросите меня ... Мы не собираемся внедрять что-то в WebSocket и не хотим использовать программные c EndPoints. Но мы хотим создать экземпляр для аннотированного класса. Почему бы нет? WebSocket инкапсулирует сложные логики c внутри себя, и этот вариант мы использовали несколько раз (например, в приложениях на WildFly).


Лучшее решение для меня было бы отключить проверку только для моего компонента, но я не могу понять, как это сделать.

Эта статья мне не помогла https://quarkus.io/guides/cdi-reference. Тот факт, что бобов. xml игнорируется не может помочь мне тоже.

Второй путь , в будущем, заключается в отключить проверку, если нет одного члена класса с аннотацией @Inject. Это может быть не правильно, но здесь есть некоторое объяснение:

Сначала контейнер вызывает конструктор бина (конструктор по умолчанию или аннотированный @Inject) , чтобы получить экземпляр компонента.

Итак, мой конструктор не "по умолчанию", и я не использовал аннотацию @Inject.

1 Ответ

1 голос
/ 01 мая 2020

Обойти это очень просто: @ javax.enterprise.inject.Vetoed аннотация отключает бин для проверки.

...