【问题标题】:How to add JSR-311 dependency for Jersey Jax-RS maven project如何为 Jersey Jax-RS maven 项目添加 JSR-311 依赖项
【发布时间】:2013-02-15 08:04:41
【问题描述】:

以下问题讨论了泽西岛和 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 的库的方式来实现。

【问题讨论】:

    标签: maven jersey jax-rs


    【解决方案1】:

    问题是您的 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 类(这就是为什么 jersey 自己的 Maven POM 中的范围是 provided,而不是 @987654328 @)。但是,对于 Grizzly Web 容器,您可能需要确保 API 类在运行时可用(通过使用上面的 &lt;dependency&gt; 声明,但将 &lt;scope&gt;provided 更改为 compile 即可这个)。

    【讨论】:

    • 我是否也需要对api 有依赖关系?我只有&lt;dependency&gt; &lt;groupId&gt;org.glassfish.jersey.core&lt;/groupId&gt; &lt;artifactId&gt;jersey-server&lt;/artifactId&gt; &lt;version&gt;2.7&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.glassfish.jersey.ext&lt;/groupId&gt; &lt;artifactId&gt;jersey-spring3&lt;/artifactId&gt; &lt;version&gt;2.8&lt;/version&gt; &lt;/dependency&gt;
    【解决方案2】:

    好吧,如果你只是使用 jersey,你可以用像

    这样的标准注释来注释你的代码
    import javax.ws.rs.Path;
    

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

    所以恐怕你的问题没有令人满意的答案(但我很高兴错了)......

    【讨论】:

      猜你喜欢
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 2020-01-20
      相关资源
      最近更新 更多