Jersey 2.1 + JBoss 7.1 NoSuchMethodError:getProperties

时间:2013-08-11 20:22:52

标签: jboss jersey jax-rs jboss7.x jersey-2.0

我正在尝试在JBoss 7.1 AS上运行Jersey 2.1 REST服务。我在部署期间收到NoSuchMethodError:javax.ws.rs.core.Application.getProperties错误:

ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/RESTService]] (MSC service thread 1-9) StandardWrapper.Throwable: java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;
at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:271) [jersey-server-2.1.jar:]
at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:283) [jersey-container-servlet-core-2.1.jar:]

在pom.xml中我有:

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.1</version>
</dependency>

在web.xml中:

<servlet>
    <servlet-name>RESTService</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.gatekeeper.restservice.RESTApplication</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

之前我尝试使用Jersey 1.17.1并且它有效(在JBoss中禁用resteasy扫描和jaxrs扩展/子系统之后)。到目前为止,我已经找到了一个类似的帖子(但是使用了Tomcat),其中的结论是错误的javax.ws.rs.core.Application在运行时绑定,并且绑定类是一个“旧”(JAX- RS 1.1)版本。

任何帮助如何解决这个问题?我是.net的家伙,我完全失明了java :) 谢谢 鲍尔泰克

3 个答案:

答案 0 :(得分:1)

我知道这个帖子不是那么新鲜,但是,我昨天才解决这个问题,似乎没什么用。

我的场景非常相似:Jersey 2.23.1 REST应用程序(JAX-RS 2.x)已在tomcat上运行,需要在JBoss 7.1.1(内置JAX-RS 1.1)上运行。

  1. 关闭web.xml中的Restease包扫描:

    <context-param>
      <param-name>resteasy.scan</param-name>
      <param-value>false</param-value>
    </context-param>
    <context-param> 
      <param-name>resteasy.scan.providers</param-name>
      <param-value>false</param-value>
    </context-param>
    <context-param>
      <param-name>resteasy.scan.resources</param-name>
      <param-value>false</param-value>
    </context-param>
    
  2. 使用&#34; jaxrs&#34;删除所有标签来自standalone.xml。否则你仍将面临LinkageError,因为JBoss保留1.1规范。

  3. 创建yourApp.war!WEB-INF \ jboss-deployment-structure.xml,就像这里指出的那样:https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7#ClassLoadinginAS7-JBossDeploymentStructureFile

  4. 这样,不仅:

    java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;

    Disapears,但是,JAXB工作正常(模块ClassNotFoundException for javax.xml.bind.JAXBException也被激活后无javax.xml.bind.api。)

    Obs1 :最初的问题是将球衣1.x与球衣2.x混合。在球衣2.x中没有PojoMappingFeature,基础包是org.glassfish.jersey。看看https://jersey.java.net/documentation/latest/migration.html#mig-1-x-json

    Obs2 :我还尝试过其他方法,例如扩展ResourceConfig并从那里扫描包或直接注册类。没有什么能像第3项中的正确文档那样工作。所以保持我的servlet不受影响:

        <servlet>
          <servlet-name>WebNize REST Service</servlet-name>
          <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
          <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>br.com.webnize.rest.service</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
          <servlet-name>WebNize REST Service</servlet-name>
          <url-pattern>/rest/*</url-pattern>
        </servlet-mapping>
    

    我希望它可以帮助别人!

答案 1 :(得分:0)

简而言之,泽西实施的1.17和2.2之间已经发生了重大的结构性变化。你需要:

1)从“org.glassfish.jersey.server.ResourceConfig”扩展您的应用程序类

2)在应用程序类构造函数中添加packages行,如下所示:

    public class MyApplication extends ResourceConfig {
        public MyApplication() {
            packages("com.mysite.MyApplication");
        }
    }

3)在web.xml中,您需要更新许多地方。见下文:

    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>javax.ws.rs.Application</param-name>
      <param-value>com.mysite.MyApplication</param-value>
    </init-param>

4)部署并享受乐趣。

答案 2 :(得分:-1)

此外,似乎不推荐在Java源代码中使用通配符的做法。

不是这个)

    @Path("/v1/status/*")

但是这个)

    @Path("/v1/status")

改进,恕我直言。