如何在使用Jersey时在界面上注释JAX-RS

use*_*622 7 java rest jax-rs jersey jersey-2.0

这个问题已经被问了几次,但答案似乎不工作,和/或泽西已经改变,有更多的变化.

我正在使用JAX-RS和Jersey(版本2.24)公开一些REST API.我希望使用JAX-RS和一个具体实现(没有任何注释)来注释接口.但是,由于这个补丁泽西停止支持这种可能性.据我了解规范,它并没有严格禁止这样做.

如果子类或实现方法具有任何JAX-RS注释,则忽略超类或接口方法上的所有注释.

意味着这样做是完全可以的.在许多情况下,使用接口是好的,并且服务器和客户端各自具有它们各自的实现.

那里有很多解决方案,

  1. 使用ResourceConfig和做一个registerClasses(MyImplementation.class).但是,这不起作用.
  2. 禁用包扫描配置web.xml,创建自定义javax.ws.rs.Applicationregister从那里执行您的实现.不行.
  3. 使用a ResourceConfig并定义一个自定义AbstractBinder并执行一个bind以便Jersey的依赖注入可以找到具体的实现.不行.
  4. 使用RESTEasy.RESTEasy似乎没有像泽西岛那样强加接口限制.从来没有尝试过.

如果有人可以分享他们的经验,我将不胜感激.任何有关如何让泽西岛工作的帮助也会很棒.至于选项(4)是否真的有必要切换?下面的示例代码.

MyResource

 package com.foo;

import javax.ws.rs.GET;
import javax.ws.rs.Path;


@Path("/hello")
public interface MyResource {

  @GET
  public String sayHello();

}
Run Code Online (Sandbox Code Playgroud)

MyResourceImpl

package com.bar;

public class MyResourceImpl implements MyResource {

  @Override
  public String sayHello() {
    return "Hello Jersey";
  }
}
Run Code Online (Sandbox Code Playgroud)

还有一个web.xml允许扫描包扫描com.foo

tec*_*504 2

在 Jersey 中,我们应该将类级别的 @Path 放在实现上而不是接口上。

包 com.foo;

import javax.ws.rs.GET;
import javax.ws.rs.Path;


@Path("/hello")
public interface MyResource {

  @GET
  public String sayHello();

}


MyResourceImpl

package com.bar;
@Path("/hello")
public class MyResourceImpl implements MyResource {

  @Override
  public String sayHello() {
    return "Hello Jersey";
  }
}
Run Code Online (Sandbox Code Playgroud)