【问题标题】:Attempting to use Jersey (JAX-RS) and Weld (CDI) in Tomcat 7. Getting noClassDefFoundError for javax.annotation.ManagedBean尝试在 Tomcat 7 中使用 Jersey (JAX-RS) 和 Weld (CDI)。为 javax.annotation.ManagedBean 获取 noClassDefFoundError
【发布时间】:2012-12-17 10:34:03
【问题描述】:

我正在尝试让 Weld 在 Tomcat 7.0.34 上与 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 是否存在更大的问题?


部署我的网络应用时的 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 注解向 servlet 发出 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'

servlet 使用 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 中,相反,日志文件显示了正在重新部署的应用程序的样子!

【问题讨论】:

  • 我在原帖中添加了更多信息。
  • 这是导致问题,还是只是日志中的某些内容?我说不出来。我想知道是否可能还有更多问题,这是一种症状。
  • 是的,这肯定会导致问题,我不能使用 CDI / @Inject,因为我得到了上面提到的异常。我应该尝试切换到另一个容器,比如 glassfish,看看它是否会发生在提供的 API 上。
  • 如果你想继续使用tomcat,你也可以试试TomEE。
  • 我尝试切换到 TomEE,但这也带来了一些问题。那似乎也不喜欢泽西岛。我可以试试玻璃鱼。

标签: java tomcat jersey cdi jboss-weld


【解决方案1】:

我遇到了完全相同的问题,我通过删除当前版本的球衣 1.16 并使用旧版本的 1.8 解决了这个问题。使用旧版本后,我不再出现此错误。

【讨论】:

  • 感谢您的建议。回到 1.11 会阻止此错误的发生,但 DI 似乎仍然无法正常工作(对象为空)。
  • 我可能还应该说,我对似乎“解决”异常问题并不感到兴奋。我宁愿了解原因,也不愿简单地退回几个版本。你有没有弄清楚到底是什么原因造成的?更好的是,您使用的是 tomcat + Weld + jersey,还是其他堆栈?
  • @Steven Bakhtiari 是的,我正在使用带有焊接功能的 tomcat 7。我也不认为 1.8 和 1.16 之间有很大的区别。我宁愿使用稍旧的版本,也不愿花一整天的时间试图让混合在一起。
【解决方案2】:

我遇到了同样的问题,一旦我按照以下说明覆盖了 ServletContainer: Weld + Jersey + Tomcat?

为了让它运行,我用 @RequestScoped 注释了我的球衣服务类,然后注入工作了。

【讨论】:

    【解决方案3】:

    只需查看球衣罐(我使用球衣 1.14),特别是 pom 文件。 您会看到它需要一些提供的依赖项,其中之一是 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 中添加此依赖项,一切都会正常工作。

    尼库

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多