这个问题曾被问过几次before,但是答案似乎没有用,而且/或者泽西岛已经进行了更多改变。
我使用JAX-RS和Jersey(版本2.24)公开了一些REST API。我希望使用JAX-RS和一个具体实现(没有任何注释)来注释接口。但是,由于this patch泽西岛停止支持这种可能性。据我了解spec,它并没有严格禁止这样做。
如果子类或实现方法具有任何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();
}
MyResourceImpl
package com.bar;
public class MyResourceImpl implements MyResource {
@Override
public String sayHello() {
return "Hello Jersey";
}
}
还有web.xml
启用了包扫描以扫描com.foo
答案 0 :(得分:0)
在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";
}
}
答案 1 :(得分:0)
如果要从实现中分离Resource接口(允许您将接口与某些REST客户端(如resteasy客户端)一起使用),则可以在实现上使用@RequestScoped。因此,此bean可以使用注入的资源,例如EJB,EntityManager,... 使用样本:
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@Path("/hello")
public interface MyResource {
@GET
public String sayHello();
}
MyResourceImpl
package com.bar;
@RequestScoped
public class MyResourceImpl implements MyResource {
@Override
public String sayHello() {
return "Hello Jersey";
}
}
但是,您必须考虑到,一旦在实现代码中使用特定的JAX-RS类(例如UriInfo,Response对象等),就会在实现和JAX-RS之间建立耦合。 API。