Java RestFul Web 服务 : JAX-RS implementation with Jersey 2. 3.1 库

标签 java jersey jax-rs jboss6.x

我正在尝试在 JBoss jboss-eap-6.1 AS 上运行一个简单的“Hallo World”应用程序 Jersey 2.3.1 REST 服务。在 web.xml 我禁用了 restEasy 库。在部署期间,我收到错误:

JBWEB000289: Servlet com.sun.jersey.samples.helloworld.resources.MyApplication threw load() exception: java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;

在 POM 中我放置了这些依赖项:

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet-core</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.0</version>
</dependency>

这是我的 web.xml 禁用了 restEasy 标签:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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/web-app_2_5.xsd">
    <servlet>
        <servlet-name>com.sun.jersey.samples.helloworld.resources.MyApplication</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.sun.jersey.samples.helloworld.resources.MyApplication</param-value>
        </init-param>
           <load-on-startup>1</load-on-startup>
    </servlet>
    <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>
    <servlet-mapping>
        <servlet-name>com.sun.jersey.samples.helloworld.resources.MyApplication</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

还有我的资源配置 java 类:

package com.sun.jersey.samples.helloworld.resources;
import org.glassfish.jersey.server.ResourceConfig;
public class MyApplication extends  ResourceConfig {   

     public MyApplication() {
            packages("com.sun.jersey.samples.helloworld.resources");
          //super(HelloWorldResource.class);

     }
}

有人有解决办法吗? 提前致谢, 罗伯托

最佳答案

NoSuchMethodError 通常意味着您的类路径中有两个不同版本的类。由于 javax.ws.rs.core.Application 类在其 JAX-RS 2 版本中确实具有 getProperties() 方法,但在 JAX-RS 1.x 中没有,我猜想你正在以某种方式将旧的 1.x Jersey(或旧的 REST api)与当前的(2.3.1)结合起来。

您正在使用的包(com.sun.jersey - '旧' Jersey 包)也指向这个方向(尽管只是将代码放入该包本身不会导致提到的问题),您显然是从 Jersey 1.x 示例开始的(Jersey 2 中也有示例,请参阅 Jersey GitHub 上的 helloworld-webapp)。

是否有可能,restEasy(也肯定包含 javax.ws.rs.core.Application 类)没有完全关闭并且以某种方式默认为 JAX-RS 1.x 版本?

我会从检查你的 pom 文件开始,查看有效的 pom(如果你的项目描述符有一些父级)并仔细检查你的类路径上的内容 - 我相信有一个 1.x 版本的 javax。 ws.rs-api 某处。也尝试清理所有编译的东西并从头开始重建。

说到依赖,如果你的列表很详尽(关于 Jersey),你很可能必须添加 jersey-common (2.3.1) 依赖,就像在初始化过程中一样,ResourceConfig.packages() 方法调用 PackageScanner 构造函数,其中包含对 ReflectionHelper 的调用 - 这不再是服务器 jar 的一部分。

希望这会有所帮助。

关于Java RestFul Web 服务 : JAX-RS implementation with Jersey 2. 3.1 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19225618/

相关文章:

java - 在 Java 中使用 Enum 进行工厂,最佳实践?

java - 如何在 Parse 中使用多个查询约束

java - POST JSON 请求中的字符编码

java - JAX-RS @产生 : how to customize JSON?

java - 如何在 BaseAdapter 的 GetView() 方法中迭代 Map 值?

java - 使用反射遍历类成员

java - 将javax.ws.rs实体序列化为json

java - 使用 Junit 进行 Jersey Restful 测试

java - 我在一个物体上有一个重载的二传手,我怎么能告诉 jackson 忽略其中一个?

java - 贾克斯-RS : Getting error message from REST call?