如何为Jersey Jax-RS maven项目添加JSR-311依赖项

时间:2013-02-15 08:04:41

标签: maven jersey jax-rs

以下问题讨论了Jersey与JAX-RS规范之间的依赖关系理论:

我假设我可以添加依赖项:

  <!--  javax.ws.rs.core e.g. Request -->
  <dependency>
     <groupId>javax.ws.rs</groupId>
     <artifactId>jsr311-api</artifactId>
     <version>1.0</version>
  </dependency>

到我的API定义maven项目并使用Jersey / Grizzly来实现。

    <jersey.version>1.15</jersey.version>
    <grizzly.version>2.2.20</grizzly.version>       

与此假设相反,我收到以下错误消息:

15.02.2013 08:41:25 org.glassfish.grizzly.http.server.HttpServerFilter handleRead
WARNUNG: Unexpected error
java.lang.IncompatibleClassChangeError: Class javax.ws.rs.core.Response$Status does not implement the requested interface javax.ws.rs.core.Response$StatusType
    at com.sun.jersey.spi.container.ContainerResponse.getStatus(ContainerResponse.java:571)

应该与Jersey 1.15一起使用的正确的JAX-RS API依赖是什么?

我希望以一种可以被任何其他符合JAX-RS的库替换实现的方式来实现。

2 个答案:

答案 0 :(得分:5)

问题是你的JSR 311 API依赖是版本1.0,而Jersey 1.15是JSR 311版本1.1实现。比较http://jsr311.java.net/nonav/releases/1.0/javax/ws/rs/core/Response.Status.htmlhttp://jsr311.java.net/nonav/releases/1.1/javax/ws/rs/core/Response.Status.html,你会看到后者实现了ResponseType接口,但前者没有。

您应该能够在构建时类路径上获得JSR 311版本1.1.1 API类文件,方法是声明:

<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>jsr311-api</artifactId>
    <version>1.1.1</version>
    <scope>provided</scope>
</dependency>

事实上,jersey-core pom.xml已经这样做了 - 上面只是http://repo1.maven.org/maven2/com/sun/jersey/jersey-core/1.15/jersey-core-1.15.pom中的第一个依赖。

在像Glassfish这样的容器中,你现在已经完成了,因为容器将负责在运行时为你提供API类(这就是为什么在泽西自己的Maven POM中的范围是{ {1}},而不是provided)。但是,对于Grizzly Web容器,您可能需要确保API类在运行时可用(通过使用上面的compile声明,但从{{1}更改<dependency> }} <scope>将执行此操作。)

答案 1 :(得分:-1)

好吧,如果您只是使用平针织,则使用标准注释(如

)注释您的代码
import javax.ws.rs.Path;

该类实际上是由jersey jars提供的。但是,由于这是注释的标准名称,删除了jersey依赖项并使用了JSR-311的另一个实现,因此你可以制作它没有太多的痛苦。但在我看来,这在理论上比在实践中看起来更好。这些事情很少像预期的那样顺利。

所以我担心你的问题没有令人满意的答案(但我会很高兴出错)......