use*_*622 7 java rest jax-rs jersey jersey-2.0
这个问题已经被问了几次前,但答案似乎不工作,和/或泽西已经改变,有更多的变化.
我正在使用JAX-RS和Jersey(版本2.24)公开一些REST API.我希望使用JAX-RS和一个具体实现(没有任何注释)来注释接口.但是,由于这个补丁泽西停止支持这种可能性.据我了解规范,它并没有严格禁止这样做.
如果子类或实现方法具有任何JAX-RS注释,则忽略超类或接口方法上的所有注释.
意味着这样做是完全可以的.在许多情况下,使用接口是好的,并且服务器和客户端各自具有它们各自的实现.
那里有很多解决方案,
ResourceConfig和做一个registerClasses(MyImplementation.class).但是,这不起作用.web.xml,创建自定义javax.ws.rs.Application并register从那里执行您的实现.不行.ResourceConfig并定义一个自定义AbstractBinder并执行一个bind以便Jersey的依赖注入可以找到具体的实现.不行.如果有人可以分享他们的经验,我将不胜感激.任何有关如何让泽西岛工作的帮助也会很棒.至于选项(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
在 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)