6

我正在尝试在 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 完全视而不见 :) 谢谢 Bartek

4

3 回答 3

1

我知道这个线程不是那么新鲜,但是,我昨天才遇到这个问题,似乎没有任何效果。

我的场景非常相似:Jersey 2.23.1 REST App (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. 从standalone.xml 中删除所有带有“jaxrs”的标签。否则你仍然会面临 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

这样,不仅:

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

消失,但 JAXB 工作正常(没有ClassNotFoundException for javax.xml.bind.JAXBException一次模块javax.xml.bind.api也被激活)。

Obs1:最初的问题是将球衣 1.x 与球衣 2.x 混合。jersey 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>

我希望它可以帮助别人!

于 2016-07-08T18:50:14.317 回答
0

简而言之,Jersey 实施的 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) 部署并玩得开心。

于 2013-08-23T13:25:28.630 回答
-1

此外,似乎已弃用在 java 源代码中使用通配符的做法。

不是这个)

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

但是这个)

    @Path("/v1/status")

改进,恕我直言。

于 2013-08-23T13:52:35.287 回答