Развертывание войны на Причале с CDI

У меня есть проект maven в IntelliJ, где я пытаюсь развернуть файл военных действий в контейнере причала. Целью этого является быстрое интеграционное тестирование некоторых функций в указанном файле войны.

Поскольку из коробки Jetty не поставляется с CDI или JNDI, я пытаюсь добавить их поддержку, но сталкиваюсь с некоторыми проблемами. Например, я получаю следующую ошибку при запуске:

15:30:50 [34mINFO [0;39m o.a.s.c.CdiObjectFactory - [lookup]: Checking for BeanManager under JNDI key java:comp/BeanManager 
15:30:50 [39mDEBUG[0;39m o.a.s.c.CdiObjectFactory - [lookup]: BeanManager lookup failed for JNDI key java:comp/BeanManager 

Я включил в свой pom банку сварного сервлета, а также добавил слушатель сварки в файл web.xml, однако он по-прежнему не работает. Я использую Jetty 9. Есть идеи?

pom.xml

    <dependency>
        <groupId>org.jboss.weld.servlet</groupId>
        <artifactId>weld-servlet-core</artifactId>
        <version>2.0.4.Final</version>
    </dependency>

web.xml

<listener>
  <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>
<resource-env-ref>
   <description>Object factory for the CDI Bean Manager</description>
   <resource-env-ref-name>BeanManager</resource-env-ref-name>
   <resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type>
</resource-env-ref>

2 ответа

Решение

Следующий конфиг работает для меня на Jetty 8.x и 9.0.x (на данный момент не 9.1+)

Вот необходимый конфиг:

Добавьте зависимость в Pom.xml

....
<dependency>
    <groupId>org.jboss.weld.servlet</groupId>
    <artifactId>weld-servlet</artifactId>
    <version>2.1.0.Final</version>
</dependency>
....

обратите внимание на то, что я использую weld-servletзависимость, которая содержит все необходимые классы Weld и CDI.

В jetty-env.xml Вы объявляете ресурсы JNDI

<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure id="webAppCtx" class="org.eclipse.jetty.webapp.WebAppContext">
    <New id="BeanManager" class="org.eclipse.jetty.plus.jndi.Resource">
        <Arg>
            <Ref id="webAppCtx"/>
        </Arg>
        <Arg>BeanManager</Arg>
        <Arg>
            <New class="javax.naming.Reference">
                <Arg>javax.enterprise.inject.spi.BeanManager</Arg>
                <Arg>org.jboss.weld.resources.ManagerObjectFactory</Arg>
                <Arg/>
            </New>
        </Arg>
    </New>
</Configure>

в web.xml Вы добавляете слушателя и выставляете ресурс JNDI:

...
<listener>
    <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>
...
<resource-env-ref>
    <resource-env-ref-name>BeanManager</resource-env-ref-name>
    <resource-env-ref-type>
        javax.enterprise.inject.spi.BeanManager
    </resource-env-ref-type>
</resource-env-ref>
...

И, в конце концов, если вы хотите иметь возможность внедрять bean-компонент в сервлет, вам нужно попросить Jetty раскрыть некоторые его внутренние классы, создав следующую jetty-web.xml файл в вашем WEB-INF каталог

<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="serverClasses">
        <Array type="java.lang.String">
            <Item>-org.eclipse.jetty.servlet.ServletContextHandler.Decorator</Item>
        </Array>
    </Set>
</Configure>

Не пропустите - в <Item/>это способ сказать Jetty, что класс больше не является внутренним классом и может быть замечен в веб-приложении. Благодаря этому Weld сможет украсить внутренний класс сервлетов Jetty, добавив в него поддержку CDI Injection.

Бонус: использование плагина Jetty для Maven

Это довольно просто, вам нужно только добавить runпрофиль к вашему pom.xmlкак это

<profile>
    <id>run</id>
    <build>
        <defaultGoal>clean jetty:run-forked</defaultGoal>
        <plugins>
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>9.0.7.v20131107</version>
                <configuration>
                    <stopPort>1353</stopPort>
                    <stopKey>quit</stopKey>
                    <contextXml>src/main/webapp/WEB-INF/jetty-web.xml</contextXml>
                </configuration>
            </plugin>
        </plugins>
    </build>
</profile>

После этого вам нужно будет только набрать mvn -Prun чтобы создать свое приложение, запустите Jetty и разверните приложение в нем.

Jetty 9.1.0+ требует Weld 2.2.0+

См.: https://issues.jboss.org/browse/WELD-1561

Другие вопросы по тегам