Weld-SE не запускается, архив bean-компонентов не найден

Я пытаюсь запустить контекст CDI-SE внутри своего приложения Quartz, поэтому у меня есть следующая зависимость (maven):

  <dependency>
                <groupId>org.jboss.weld.se</groupId>
                <artifactId>weld-se-core</artifactId>
                <version>2.3.4.Final</version>
            </dependency>

Внутри моего JobQuartz у меня есть метод execute() со следующим:

public void execute(JobExecutionContext context) throws JobExecutionException {
        Weld weld = new Weld();
        WeldContainer container = weld.initialize();
        service = container.instance().select(MyService.class).get();
        service.go();
        weld.shutdown();
    }

Но я получил следующую ошибку:

Caused by: java.lang.IllegalStateException: WELD-ENV-002009: Weld SE container cannot be initialized - no bean archives found

Мой проект представляет собой WAR, поэтому я поместил файл beans.xml внутрь /src/main/webapp/META-INF/, см. содержимое:

<?xml version="1.0"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       version="1.2" bean-discovery-mode="all">

</beans>

Я скопировал файл в /src/main/resource/META-INF, но получил ту же ошибку.


person Ronaldo Lanhellas    schedule 21.11.2017    source источник
comment
Как вы разворачиваете или начинаете эту ВОЙНУ? Обычно вы должны использовать Weld SE с JAR. WAR обычно является сервером/сервлетом, где вы используете стандартный сервлет Weld/weld (ни один из которых вы не запускаете вручную).   -  person Siliarus    schedule 21.11.2017
comment
В качестве примечания (не решает вашу проблему), WeldContainer реализует Instance, поэтому вы должны быть в состоянии сделать container.select(MyService.class). Метод WeldContainer.instance() устарел в более новых версиях.   -  person Siliarus    schedule 21.11.2017
comment
@Siliarus, я развертываю свою войну в JBoss, но кварц, мне нужны прицелы, которых нет у кварца, поэтому я использовал сварку   -  person Ronaldo Lanhellas    schedule 21.11.2017
comment
beans.xml должен находиться в /src/main/webapp/WEB-INF/, а не /src/main/webapp/META-INF/   -  person Rouliboy    schedule 21.11.2017
comment
У меня тоже есть beans.xml в этом пути, но я получил ту же ошибку   -  person Ronaldo Lanhellas    schedule 21.11.2017
comment
Если вы используете JBoss EAP или WildFly, то вы находитесь в EE, и использование контейнера Weld SE вам не подойдет. У сервера есть собственная реализация CDI (на самом деле это еще одна разновидность Weld), которую он будет запускать самостоятельно. Все, что вам нужно сделать, это иметь зависимость от CDI, и вы сможете его использовать (плюс, конечно, beans.xml в зависимости от режима обнаружения, который вы хотите иметь).   -  person Siliarus    schedule 21.11.2017
comment
@Siliarus, у меня есть веб-приложение (война), как видите, с моим CDI все работает нормально. Но когда я использую Quartz, у меня нет некоторых областей, которые мне нужны, например: RequestedScope. Чтобы решить эту проблему, я пытаюсь запустить Scope вручную с помощью Weld-SE, это правильно?   -  person Ronaldo Lanhellas    schedule 21.11.2017
comment
Нет, это неправильно. Какую версию сварки вы используете?   -  person John Ament    schedule 21.11.2017
comment
@RonaldoLanhellas нет, это неправильно. Я попытаюсь сформулировать ответ на основе деталей, которые вы мне здесь дали.   -  person Siliarus    schedule 21.11.2017


Ответы (2)


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

Прежде всего, вам не следует запускать контейнер Weld SE самостоятельно, так как тогда у вас будут два контейнера, работающие бок о бок (что не предназначено/не поддерживается) — один SE и один «классический», обрабатываемый контейнером. Придерживайтесь модели с контейнерной ручкой, которая загружается для вас без особых усилий.

Теперь я вижу, что вам не хватает некоторых средств активации прицела. Если вы используете какую-то более новую версию Weld, вы можете использовать перехватчик, который активирует RequestContext (я полагаю, это тот, который вам нужен) перед методом и затем отключает его. Все, что вам нужно для этого, — это зависимость от Weld API (которая в любом случае включена в WFLY), а затем вы просто аннотируете ею свой метод или класс.

Для вышеперечисленного вам понадобится Weld 2.4.x. Обратите внимание, что вы можете просто пропатчить свой WildFly. Патчи находятся в нижней части веб-сайта Weld, а инструкции можно найти здесь.

Если вы используете Weld 3/CDI 2.0, то есть даже встроенный bean-компонент (RequestContextController), который позволяет вам контролировать этот жизненный цикл.

Другим вариантом является Deltaspike, как указал Джохм Амент, но для этого вам нужно ввести другую зависимость.

person Siliarus    schedule 21.11.2017
comment
Я думаю, что нашел другое решение: заставить мой Quartz JOB вызывать мою службу из клиента отдыха, таким образом, у меня есть контекст CDI. Я пробовал и работает нормально. Что вы думаете - person Ronaldo Lanhellas; 21.11.2017
comment
Вы не показали фактический код, который не соответствует вашим ожиданиям, поэтому трудно судить. Однако то, что вы описываете, звучит нормально, поскольку в целом оно просто создает запрос, следовательно, вызывает контекст области запроса. Это звучит правдоподобно. - person Siliarus; 21.11.2017
comment
Точно, я просто запускаю HTTP-запрос с использованием JAX-RS. - person Ronaldo Lanhellas; 21.11.2017

Если вы пытаетесь запустить контекст запроса, у вас есть несколько решений.

  1. Используйте интеграцию DeltaSpike Quartz для CDI — http://deltaspike.apache.org/documentation/scheduler.html

  2. Программно запускайте и останавливайте контекст, используя BoundRequestContext (это bean-компонент CDI, который вы можете внедрить).

Я бы настоятельно рекомендовал подход DeltaSpike, так как он позаботится обо всех настройках, которые вам потребуются для автоматического запуска контекста.

person John Ament    schedule 21.11.2017