1

Tomcat 7.0.34 で Weld を Jersey と連携させようとしていますが、この問題が発生しているようです。実際の例外は

java.lang.NoClassDefFoundError: javax/annotation/ManagedBean

しかし、私は @ManagedBean アノテーションで何かに明示的にアノテーションを付けていないので、Weld が暗黙的にこれを行っていると推測しています。この注釈は Weld によって提供されたはずですか、それとも他の依存関係がありませんか?

私のpom.xmlファイルには以下が含まれています:

<dependency>
    <!-- CDI implementation -->
    <groupId>org.jboss.weld.servlet</groupId>
    <artifactId>weld-servlet</artifactId>
    <version>${weld.version}</version>
</dependency>

何か足りないものはありますか、それとも Weld と Jersey を使用しようとするともっと大きな問題がありますか?


Web アプリをデプロイするときの catalina.out:

...
Jan 03, 2013 2:21:21 AM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive /usr/local/Cellar/tomcat/7.0.34/libexec/webapps/tracker.war
Jan 03, 2013 2:21:22 AM org.jboss.weld.bootstrap.WeldBootstrap <clinit>
INFO: WELD-000900 1.1.10 (Final)
Jan 03, 2013 2:21:22 AM org.jboss.weld.bootstrap.WeldBootstrap startContainer
INFO: WELD-000101 Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously.
Jan 03, 2013 2:21:22 AM org.jboss.weld.environment.tomcat7.Tomcat7Container initialize
INFO: Tomcat 7 detected, CDI injection will be available in Servlets and Filters. Injection into Listeners is not supported
Jan 03, 2013 2:21:22 AM org.jboss.weld.interceptor.util.InterceptionTypeRegistry <clinit>
WARNING: Class 'javax.ejb.PostActivate' not found, interception based on it is not enabled
Jan 03, 2013 2:21:22 AM org.jboss.weld.interceptor.util.InterceptionTypeRegistry <clinit>
WARNING: Class 'javax.ejb.PrePassivate' not found, interception based on it is not enabled
Jan 03, 2013 2:21:22 AM com.sun.jersey.api.core.PackagesResourceConfig init
INFO: Scanning for root resource and provider classes in the packages:
...
Jan 03, 2013 2:21:22 AM com.sun.jersey.server.impl.cdi.CDIComponentProviderFactoryInitializer initialize
INFO: CDI support is enabled
Jan 03, 2013 2:21:22 AM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.16 11/28/2012 02:09 PM'

@Inject アノテーションを使用してサーブレットに HTTP リクエストを行うときの catalina.out

Jan 03, 2013 2:23:12 AM com.sun.jersey.api.core.PackagesResourceConfig init
INFO: Scanning for root resource and provider classes in the packages:
  substrate.tracker.api
Jan 03, 2013 2:23:12 AM com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Root resource classes found:
  class substrate.tracker.api.ProjectsResource
  class substrate.tracker.api.UsersResource
  class substrate.tracker.api.IssuesResource
  class substrate.tracker.api.PingResource
Jan 03, 2013 2:23:12 AM com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Provider classes found:
  class substrate.tracker.api.exception.ParameterExceptionMapper
Jan 03, 2013 2:23:12 AM com.sun.jersey.server.impl.cdi.CDIComponentProviderFactoryInitializer initialize
INFO: CDI support is enabled
Jan 03, 2013 2:23:12 AM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.16 11/28/2012 02:09 PM'

サーブレットは、500 HTTP ステータス コードでリクエストに応答しました。根本原因のスタック トレース:

java.lang.NoClassDefFoundError: javax/annotation/ManagedBean
com.sun.jersey.server.impl.cdi.CDIComponentProviderFactory.getComponentProvider(CDIComponentProviderFactory.java:116)
com.sun.jersey.server.impl.cdi.CDIComponentProviderFactory.getComponentProvider(CDIComponentProviderFactory.java:103)
com.sun.jersey.core.spi.component.ioc.IoCProviderFactory._getComponentProvider(IoCProviderFactory.java:89)
com.sun.jersey.core.spi.component.ProviderFactory.getComponentProvider(ProviderFactory.java:153)
com.sun.jersey.core.spi.component.ProviderServices.getComponent(ProviderServices.java:251)
com.sun.jersey.core.spi.component.ProviderServices.getProviders(ProviderServices.java:148)
com.sun.jersey.server.impl.application.ExceptionMapperFactory.init(ExceptionMapperFactory.java:74)
com.sun.jersey.server.impl.application.WebApplicationImpl._initiate(WebApplicationImpl.java:1307)
com.sun.jersey.server.impl.application.WebApplicationImpl.access$700(WebApplicationImpl.java:168)
com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:774)
com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:770)
com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193)
com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:770)
com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:765)
com.sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.java:489)
com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.java:319)
com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:609)
com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:210)
com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:374)
com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:557)
javax.servlet.GenericServlet.init(GenericServlet.java:160)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
java.lang.Thread.run(Thread.java:722)

奇妙なことに、スタック トレースは catalina.out に表示されません。代わりに、ログ ファイルには、アプリが再デプロイされているように見えるものが表示されます。

4

3 に答える 3

2

Weld + Jersey + Tomcat?で述べられているように、ServletContainer をオーバーライドすると、同じ問題が発生しました 。

実行できるようにするために、ジャージ サービス クラスに @RequestScoped のアノテーションを付けると、インジェクションが機能しました。

于 2013-02-27T10:12:04.173 に答える
0

私はまったく同じ問題を抱えていましたが、現在のバージョンの1.16であるジャージを削除し、古いバージョンである1.8を使用することで問題を解決しました。古いバージョンを使用した後、このエラーは発生しなくなりました。

于 2013-01-05T15:51:26.093 に答える
0

ジャージージャー(私はジャージー1.14を使用しています)、特にpomファイルを見てください。いくつかの提供された依存関係が必要であることがわかります。そのうちの 1 つは javax.ejb 3.1 です。

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.ejb</artifactId>
    <version>3.1</version>
    <scope>provided</scope>
</dependency>

この jar には、必要なクラス javax.annotation.ManagedBean が含まれています。このクラスを含む他の jar をインポートすると機能しません。それはジャージーの瓶が束ねられていたからなのですが、それはまた別の話です。

この依存関係を pom 内に追加するだけで、すべてが正常に機能します。

ニク

于 2013-04-26T14:49:22.457 に答える