web-dev-qa-db-ja.com

CDIインジェクションがサーブレットで機能しない

私は本当にあなたの助けが必要です。私はこの問題に数週間から数ヶ月取り組んでいます。長い投稿をお詫びしますが、問題と私の設定をできるだけ正確に説明したいと思います。

私のJava EE 6 Webアプリケーションには主に3つのサーブレットが含まれています:ajavax.faces.webapp.FacesServlet、StreamingServlet拡張javax.servlet.http.HttpServletおよびorg.Eclipse.jetty.websocket.WebSocketServletこれらのサーブレットでCDIを使用したいのですが、FacesServlet、より正確には、JSFアクションがルーティングされるBeanに対してのみ機能します。CDIインジェクションは他の2つのサーブレットでは機能しません。

私のプロジェクトのセットアップは次のとおりです:Maven 3.0.4、Jetty 8.1.4(jetty-maven-plugin)、MyFaces 2.1.6、Weld1.1.8。

ファイルpom.xmlには、CDIの依存関係が含まれています。

...
<dependency>
    <groupId>javax.enterprise</groupId>
    <artifactId>cdi-api</artifactId>
    <version>1.1.EDR1.2</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>jsr250-api</artifactId>
    <version>1.0</version>
</dependency>
<dependency>
    <groupId>org.jboss.weld.servlet</groupId>
    <artifactId>weld-servlet</artifactId>
    <version>${weld.version}</version>
    <scope>runtime</scope>
</dependency>
...

ファイルsrc/main/webapp/WEB-INF/Beans.xmlには、CDIをアクティブ化するための空のbeans要素のみが含まれています。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://Java.Sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>

ファイルscr/main/webapp/WEB-INF/jetty-env.xmlには、JNDIを介してBeanマネージャーを取得するためのJetty固有の構成が含まれています。

<!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>

ファイルsrc/main/webapp/WEB-INF/web.xmlには、CDIをブートストラップするためのサーブレットリスナーとBeanManagerリファレンスが含まれています。

...
<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>
...

これらの設定では、mvn jetty:runを使用してアプリケーションを実行すると常に次のエラーが発生します(最初の行が最も重要です):

2012-07-31 11:09:33,546 [main] ERROR org.jboss.weld.environment.jetty.JettyPost72Container - Unable to create JettyWeldInjector. CDI injection will not be available in Servlets, Filters or Listeners
Java.lang.IllegalArgumentException: Cannot load class for org.jboss.weld.environment.jetty.WeldDecorator
    at org.jboss.weld.environment.servlet.util.Reflections.classForName(Reflections.Java:58)
    at org.jboss.weld.environment.jetty.JettyPost72Container.initialize(JettyPost72Container.Java:66)
    at org.jboss.weld.environment.servlet.Listener.contextInitialized(Listener.Java:162)
    at org.Eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.Java:764)
    at org.Eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.Java:406)
    at org.Eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.Java:756)
    at org.Eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.Java:242)
    at org.Eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.Java:1234)
    at org.Eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.Java:699)
    at org.Eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.Java:467)
    at org.mortbay.jetty.plugin.JettyWebAppContext.doStart(JettyWebAppContext.Java:256)
    at org.Eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.Java:59)
    at org.Eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.Java:224)
    at org.Eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.Java:167)
    at org.Eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.Java:59)
    at org.Eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.Java:224)
    at org.Eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.Java:59)
    at org.Eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.Java:90)
    at org.Eclipse.jetty.server.Server.doStart(Server.Java:262)
    at org.mortbay.jetty.plugin.JettyServer.doStart(JettyServer.Java:65)
    at org.Eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.Java:59)
    at org.mortbay.jetty.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.Java:511)
    at org.mortbay.jetty.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.Java:364)
    at org.mortbay.jetty.plugin.JettyRunMojo.execute(JettyRunMojo.Java:516)
    at org.Apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.Java:101)
    at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:209)
    at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:153)
    at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:145)
    at org.Apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.Java:84)
    at org.Apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.Java:59)
    at org.Apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.Java:183)
    at org.Apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.Java:161)
    at org.Apache.maven.DefaultMaven.doExecute(DefaultMaven.Java:320)
    at org.Apache.maven.DefaultMaven.execute(DefaultMaven.Java:156)
    at org.Apache.maven.cli.MavenCli.execute(MavenCli.Java:537)
    at org.Apache.maven.cli.MavenCli.doMain(MavenCli.Java:196)
    at org.Apache.maven.cli.MavenCli.main(MavenCli.Java:141)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
    at Java.lang.reflect.Method.invoke(Method.Java:597)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.Java:290)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.Java:230)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.Java:409)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.Java:352)
Caused by: Java.lang.NoClassDefFoundError: org/Eclipse/jetty/servlet/ServletContextHandler$Decorator
    at Java.lang.ClassLoader.defineClass1(Native Method)
    at Java.lang.ClassLoader.defineClassCond(ClassLoader.Java:631)
    at Java.lang.ClassLoader.defineClass(ClassLoader.Java:615)
    at Java.security.SecureClassLoader.defineClass(SecureClassLoader.Java:141)
    at Java.net.URLClassLoader.defineClass(URLClassLoader.Java:283)
    at Java.net.URLClassLoader.access$000(URLClassLoader.Java:58)
    at Java.net.URLClassLoader$1.run(URLClassLoader.Java:197)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Java.net.URLClassLoader.findClass(URLClassLoader.Java:190)
    at org.Eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.Java:415)
    at org.Eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.Java:377)
    at org.jboss.weld.environment.servlet.util.Reflections.classForName(Reflections.Java:51)
    ... 44 more
Caused by: Java.lang.ClassNotFoundException: org.Eclipse.jetty.servlet.ServletContextHandler$Decorator
    at Java.net.URLClassLoader$1.run(URLClassLoader.Java:202)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Java.net.URLClassLoader.findClass(URLClassLoader.Java:190)
    at org.Eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.Java:415)
    at org.Eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.Java:377)
    ... 56 more

アプリケーションは実行されていましたが、例外メッセージに次のように記載されています。CDIインジェクションはサーブレットでは使用できません。

数日前、私は記事 MavenからWeld-ServletとJettyプラグインを使用してCDI Webアプリを起動する 、特にセクションサーブレットへの挿入を許可する最後のトリックを見つけました。著者は、サーブレットで@Injectアノテーションを使用するためにWeldがいくつかのJetty内部クラスを装飾する必要があり、Weldサーブレットに装飾させるためにこのクラスの場所をJettyクラスローダーに指示する必要があると説明しています。

私はこの特別な情報をとても待ち望んでいました。だから私はファイルsrc/main/webapp/WEB-INF/jetty-context.xmlを追加しました:

<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.Eclipse.org/jetty/configure.dtd">

<Configure id="webAppCtx" 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> 

また、ファイルjetty-context.xml(最後の行)を組み込むために、pom.xmlを更新しました。

...
<plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>${jetty.version}</version>
    <configuration>
        <webApp>
            <contextPath>/${project.build.finalName}</contextPath>
        </webApp>
        <jettyEnvXml>src/main/webapp/WEB-INF/jetty-env.xml</jettyEnvXml>
        <contextXml>src/main/webapp/WEB-INF/jetty-context.xml</contextXml>
        ...

これで、上記のエラーは消えました。私はその短い瞬間にとても幸せでした:)

Src/main/resources/log4j.propertiesで、Weldのログレベルを上げました。

...
log4j.logger.org.jboss.weld=DEBUG, stdout
log4j.additivity.org.jboss.weld=false
...

アプリケーションを起動すると、次の溶接ログメッセージが表示されます。

...
2012-07-31 12:00:08,968 [main] INFO  org.jboss.weld.Bootstrap - WELD-000101 Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously.
2012-07-31 12:00:09,109 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000103 Enabled alternatives for Manager
Enabled alternatives: [] []
Registered contexts: [interface javax.enterprise.context.SessionScoped, interface javax.enterprise.context.ApplicationScoped, interface javax.enterprise.context.Dependent, interface javax.enterprise.context.RequestScoped, interface javax.enterprise.context.ConversationScoped, interface javax.inject.Singleton]
Registered beans: 0
: [] []
2012-07-31 12:00:09,109 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000104 Enabled decorator types for Manager
Enabled alternatives: [] []
Registered contexts: [interface javax.enterprise.context.SessionScoped, interface javax.enterprise.context.ApplicationScoped, interface javax.enterprise.context.Dependent, interface javax.enterprise.context.RequestScoped, interface javax.enterprise.context.ConversationScoped, interface javax.inject.Singleton]
Registered beans: 0
: []
2012-07-31 12:00:09,109 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000105 Enabled interceptor types for Manager
Enabled alternatives: [] []
Registered contexts: [interface javax.enterprise.context.SessionScoped, interface javax.enterprise.context.ApplicationScoped, interface javax.enterprise.context.Dependent, interface javax.enterprise.context.RequestScoped, interface javax.enterprise.context.ConversationScoped, interface javax.inject.Singleton]
Registered beans: 0
: []
2012-07-31 12:00:09,171 [main] INFO  org.jboss.weld.environment.jetty.JettyPost72Container - Jetty7 detected, JSR-299 injection will be available in Listeners, Servlets and Filters.
2012-07-31 12:00:09,265 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: Implicit Bean [javax.enterprise.inject.spi.InjectionPoint] with qualifiers [@Default]
2012-07-31 12:00:09,265 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-flat-Built-in-org.jboss.weld.context.DependentContext
2012-07-31 12:00:09,281 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: Managed Bean [class de.telexiom.cardiom.util.MediaType] with qualifiers [@Any @Default]
2012-07-31 12:00:09,281 [main] WARN  org.jboss.weld.interceptor.util.InterceptionTypeRegistry - Class 'javax.ejb.PostActivate' not found, interception based on it is not enabled
2012-07-31 12:00:09,281 [main] WARN  org.jboss.weld.interceptor.util.InterceptionTypeRegistry - Class 'javax.ejb.PrePassivate' not found, interception based on it is not enabled
2012-07-31 12:00:09,281 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: Managed Bean [class de.telexiom.cardiom.web.LoginBean] with qualifiers [@Any @Default]
2012-07-31 12:00:09,281 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-flat-Built-in-org.jboss.weld.context.http.HttpRequestContext
2012-07-31 12:00:09,281 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-flat-Built-in-org.jboss.weld.context.http.HttpSessionContext
2012-07-31 12:00:09,281 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: Managed Bean [class de.telexiom.cardiom.web.CustomerBean] with qualifiers [@Any @Default @Named]
2012-07-31 12:00:09,281 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-flat-Built-in-org.jboss.weld.context.bound.BoundConversationContext
2012-07-31 12:00:09,281 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-flat-Built-in-org.jboss.weld.context.ApplicationContext
2012-07-31 12:00:09,281 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: Managed Bean [class de.telexiom.cardiom.util.LocaleBean] with qualifiers [@Any @Default @Named]
2012-07-31 12:00:09,281 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-flat-Built-in-org.jboss.weld.context.bound.BoundRequestContext
2012-07-31 12:00:09,281 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-flat-Built-in-org.jboss.weld.context.SingletonContext
2012-07-31 12:00:09,281 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: Implicit Bean [javax.enterprise.inject.Instance] with qualifiers [@Default]
2012-07-31 12:00:09,296 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: Managed Bean [class de.telexiom.cardiom.DataReader] with qualifiers [@Any @Default @Named]
2012-07-31 12:00:09,296 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: Managed Bean [class de.telexiom.cardiom.SessionBean] with qualifiers [@Any @Default @Named]
2012-07-31 12:00:09,296 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: Managed Bean [class de.telexiom.cardiom.ConnectionTable] with qualifiers [@Any @Default @Named]
2012-07-31 12:00:09,296 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-flat-Built-in-org.jboss.weld.context.http.HttpConversationContext
2012-07-31 12:00:09,296 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: Managed Bean [class de.telexiom.cardiom.servlet.ClientServlet] with qualifiers [@Any @Default]
2012-07-31 12:00:09,296 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-flat-Built-in-org.jboss.weld.context.RequestContext
2012-07-31 12:00:09,296 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-flat-Built-in-javax.enterprise.context.Conversation
2012-07-31 12:00:09,296 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: Implicit Bean [javax.enterprise.event.Event] with qualifiers [@Default]
2012-07-31 12:00:09,296 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: Managed Bean [class de.telexiom.cardiom.CustomerListBean] with qualifiers [@Any @Default]
2012-07-31 12:00:09,296 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: Managed Bean [class de.telexiom.cardiom.Customer] with qualifiers [@Any @Default]
2012-07-31 12:00:09,296 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: Managed Bean [class de.telexiom.cardiom.servlet.StreamingServlet] with qualifiers [@Any @Default]
2012-07-31 12:00:09,296 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-flat-Built-in-org.jboss.weld.context.bound.BoundSessionContext
2012-07-31 12:00:09,296 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106 Bean: Managed Bean [class de.telexiom.cardiom.SessionInfo] with qualifiers [@Any @Default]
2012-07-31 12:00:09,312 [main] DEBUG org.jboss.weld.Reflection - WELD-000601 interface javax.inject.Named is missing @Target. Weld will use this annotation, however this may make the application unportable.
2012-07-31 12:00:09,312 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000100 Weld initialized. Validating beans
...

Servlet 3.0 APIを使用していますが、StreamingServletとClientServletはアノテーションを介して構成されています。問題は、アプリケーションスコープのBeanconnectionTableおよびdataReaderが注入されないことです。 :

@WebServlet(value = "/stream", initParams = @WebInitParam(name = "maxIdleTime", value = "0"))
public class StreamingServlet extends HttpServlet
{
    @Inject
    private ConnectionTable connectionTable;
    ...

@WebServlet(value = "/Push", loadOnStartup = 1, initParams = @WebInitParam(name = "maxIdleTime", value = "0"))
public class ClientServlet extends WebSocketServlet
{
    @Inject
    private ConnectionTable connectionTable;

    @Inject
    private DataReader dataReader;
    ...

注入された(されていない)プロパティを呼び出すと、常にNullPointerExceptionsが発生します。 web.xmlを介してサーブレットを構成する場合にも問題が残ります。私は自分が間違っていることについてこれ以上考えがありません。 JettyとMavenと組み合わせたCDIに関するすべての記事を読んで、これらの注入の問題を抱えているのは私だけではないかと思います。

私のJSFBeanクラスUserBean.Javaでは、インジェクションが機能します。プロパティconnectionTableとdataReaderを初期化するためにsetterメソッドを使用する必要はありません。

以下の出力ステートメントをDataReaderコンストラクター(およびConnectionTableクラス)で使用する

@ApplicationScoped
public class DataReader implements Serializable
{
    ...
    public DataReader()
    {
        System.out.println("DataReader.DataReader(): " + this);
    }
    ...

Stdoutに表示される2つのDataReaderインスタンスについて疑問に思います。

...
2012-07-31 14:03:04,843 [qtp5435124-17] DEBUG org.jboss.weld.JSF - WELD-000504 Resuming conversation with id null
31.07.2012 14:03:05 org.Apache.myfaces.util.ExternalSpecifications isUnifiedELAvailable
INFO: MyFaces Unified EL support enabled
DataReader.DataReader(): DataReader$Proxy$_$$_WeldClientProxy@506e6d
ConnectionTable.ConnectionTable(): ConnectionTable$Proxy$_$$_WeldClientProxy@93b16c

2012-07-31 14:03:19,093 [qtp5435124-16] DEBUG org.jboss.weld.JSF - WELD-000504 Resuming conversation with id null
DataReader.DataReader(): DataReader@1cbd382

最初の5行はフォームベース認証の後に印刷され、最後の2行は、挿入されたdataReaderプロパティが使用されるJSFアクションが初めて処理されるときに表示されます。 Beanはアプリケーションスコープであるため、2つのコンストラクターパスについて本当に疑問に思います。しかし、アプリケーションの動作から、私はそれで何も悪いことはないと思います。

私の最後の仮定は、サーブレットがどういうわけか、分離された独立したコンテキストやコンテナなどに住んでいるということです。他の2つのサーブレットでFacesContextを取得することもできないため:FacesContext.getCurrentInstance()nullを返します。しかし、これが何らかの形で重要かどうかはわかりません。

誰かが私が問題を理解するのを手伝ってくれることを願っています。前もって感謝します

セバスチャン

8
Sebastian S.

うーん...あなたの設定は私のものと非常によく似ています。私が知らなかったのは、この「Java-web-api」Mavenアーティファクトでした。私はこれを新しいプロジェクトでチェックしました、そして出来上がり...それは動作します。その後、JSFとWebSocketのサポートを順次追加しましたが、再び機能しませんでした。最後に、エラーが何であるかを理解しました。pom.xmlへの依存関係として「jetty-server」アーティファクトを追加しましたが、スコープを設定しませんでした。だから私は間違ったサーバーライブラリかそのようなものを使っていました。 '提供された'スコープを使用する場合

<dependency>
    <groupId>org.Eclipse.jetty</groupId>
    <artifactId>jetty-server</artifactId>
    <version>${jetty.version}</version>
    <scope>provided</scope>
</dependency>

すべてが機能しているようで、依存性注入もサーブレットで機能しています。

あなたのpomに関してもう2つの質問があります:

  1. Jetty Mavenプラグインの<jettyEnvXml>要素を設定する必要はありませんか?

  2. ここでも、Jetty Mavenプラグインで、<webAppConfig>要素を使用します。 <webApp>要素を使用していたのは、これがEclipseコード補完によって認識されているためです。これらの要素の1つは非推奨になり、他の要素が優先されますか?

6
Sebastian S.

エラーは明らかです:

Java.lang.NoClassDefFoundError: org/Eclipse/jetty/servlet/ServletContextHandler$Decorator

Weldは上記のJettyサーバークラスを見つけることができません。このクラスが見つからない理由は、Jettyのクラスローディングメカニズムが原因です。 JettyのWebAppClassloaderには、ロードしないサーバークラスのデフォルトリストがあります。 http://wiki.Eclipse.org/Jetty/Reference/Jetty_Classloading を参照してください。

Server Classes
-org.Eclipse.jetty.continuation.             don't hide continuation classes
-org.Eclipse.jetty.jndi.                     don't hide naming classes
-org.Eclipse.jetty.plus.jaas.                don't hide jaas classes
-org.Eclipse.jetty.websocket.                don't hide websocket extension
-org.Eclipse.jetty.servlet.DefaultServlet    don't hide default servlet
org.Eclipse.jetty.                           hide all other jetty classes

Jettyがこのクラスをロードできるようにするには、「-org.Eclipse.jetty.servlet」を追加する必要があります。 jetty-web.xmlのサーバークラスリストに追加します。

 <Configure class="org.Eclipse.jetty.webapp.WebAppContext">
   <Call name="prependServerClass"><Arg>-org.Eclipse.jetty.servlet.</Arg></Call>
 </Configure>

または、埋め込み桟橋を使用している場合は、次のメソッドを呼び出します。

 context.prependServerClass("-org.Eclipse.jetty.servlet.");
9
Roosevelt Lai

@Roosevelt Laiのアドバイスを適用しようとしている人のために、NoSuchMethod例外が発生したため、jetty-web.xmlで呼び出されるメソッドの名前を<Call name="addServerClass"><Arg>-org.Eclipse.jetty.servlet.</Arg></Call>に変更しました。

これは ここのドキュメント に示されているとおりです

桟橋(8.1.14.v20131031)

1
kosgeinsky

この正確なエラーメッセージに関する私の3日間の経験、

Java.lang.NoClassDefFoundError:javax/entity/inject/spi/InjectionTarget

cdi-api.jarasinstall/glassfish/modulesファイルの名前はcdi-api-1.2.jarでした。名前をcdi-api.jarに変更すると、エラーは消えました。

仕様:

  • Glassfish 4.1(Zipファイルとしてダウンロード)、
  • jdk1.8.0_45、
  • OS X 10.7.5
1
Mse