Web services 与jersey的restful服务接口
我可以用接口和实现类创建restful服务吗 如果是这样,所有JAX-RS相关的导入都会进入接口吗 我正在使用jersey2.4和jetty8.1 这是我的Web services 与jersey的restful服务接口,web-services,jetty,jackson,jersey-2.0,jetty-8,Web Services,Jetty,Jackson,Jersey 2.0,Jetty 8,我可以用接口和实现类创建restful服务吗 如果是这样,所有JAX-RS相关的导入都会进入接口吗 我正在使用jersey2.4和jetty8.1 这是我的MyService界面: package foo.bar; @Path("/abc") public interface MyService { @GET @JSONP @Path("/method/{id}") public MyResponse getStuff(@PathParam("id"
MyService
界面:
package foo.bar;
@Path("/abc")
public interface MyService {
@GET
@JSONP
@Path("/method/{id}")
public MyResponse getStuff(@PathParam("id") Integer id);
}
以及该接口的MyServiceImpl
实现
package foo.bar.impl;
public class MyServiceImpl implements MyService {
public MyServiceImpl() {}
@Override
public MyResponse getStuff(Integer id) {
// do stuff
return MyResponse;
}
}
以下是web.xml文件:
<servlet>
<servlet-name>Scivantage REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>foo.bar</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
当我尝试使用实现类包(foo.bar.impl
)时,它抱怨说
I get HTTP ERROR 404; doesn't do anything else; no exceptions on console
当我尝试这两种方法时,它的抱怨与上面相同:
javax.servlet.ServletException: A MultiException has 1 exceptions. They are:|1. java.lang.NoSuchMethodException: Could not find a suitable constructor in foo.bar.MyService class.
我做错了什么 是的,您可以使用界面进行注释。在我们的应用程序中,我们是通过这种方式实现的。以下引用自Jersy JAX-RS注释可用于 超级类或实现的接口。这样的注释是 由相应的子类或实现类方法继承 前提是该方法及其参数没有任何JAX-RS 它自己的注释。超类上的注释优先 在实现的接口上。如果是子类或 实现方法具有任何JAX-RS注释,然后所有 超类或接口方法上的注释将被忽略 我认为在您的情况下,由于您可能遗漏了映射而导致的错误请检查。
应用程序编程接口
/原料药/*
我也在努力解决“找不到合适的构造函数”的问题。我想把我所有的注释(包括@Path)放在我的接口上。我能够通过自己管理资源的生命周期而不是让Jersey实例化它们来让它工作
例如,如果您有YourImplementation
,它实现了YourRestInterface
,那么您可以这样做,向Jersey注册一个实现实例:
public class RestConfig extends ResourceConfig {
@Inject
public RestConfig(ServiceLocator locator) {
super();
DynamicConfiguration c = Injections.getConfiguration(locator);
Object implInstance = new YourImplementation();
ServiceBindingBuilder<Object> bb = Injections.newFactoryBinder(new BeanFactory(locator, implInstance));
// tell Jersey to use the factory below to get an instance of YourRestInterface.class
bb.to(YourRestInterface.class);
Injections.addBinding(bb, c);
c.commit();
}
private static class BeanFactory implements Factory<Object> {
private ServiceLocator locator;
private Object bean;
BeanFactory(ServiceLocator locator, Object bean)
{
this.locator = locator;
this.bean = bean;
}
@Override
public Object provide() {
// have Jersey inject things annotated with @Context
locator.inject(bean);
return bean;
}
@Override
public void dispose(Object instance) {
}
}
}
public类RestConfig扩展了ResourceConfig{
@注入
公共RestConfig(ServiceLocator定位器){
超级();
DynamicConfiguration c=Injections.getConfiguration(定位器);
Object implInstance=新的YourImplementation();
ServiceBindingBuilder bb=Injections.newFactoryBinder(新BeanFactory(locator,implInstance));
//告诉Jersey使用下面的工厂获取YourRestInterface.class的实例
to(YourRestInterface.class);
注射。添加结合(bb,c);
c、 提交();
}
私有静态类BeanFactory实现工厂{
专用服务定位器;
私有对象bean;
BeanFactory(ServiceLocator定位器,对象bean)
{
this.locator=定位器;
this.bean=bean;
}
@凌驾
公共对象提供(){
//用@Context注释事物
定位器。注入(bean);
返回豆;
}
@凌驾
public void dispose(对象实例){
}
}
}
如果要使用带有JAX-RS注释的接口,则不能再使用web.xml扫描包
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>XXX</param-value>
原因是:
出于性能原因,我们决定在扫描过程中忽略接口。我们还修复了Jersey不会尝试实例化接口的问题
我在几次试验后发现了一个解决方案(我正在使用jetty 9和jersey 2.13):与其使用
@Path(“/abc”)
注释接口,不如尝试注释实现类
我认为这很有意义,因为接口是“抽象的”,不应该绑定到物理路径。这样,接口就可以在不同的路径中重用。在类
ResourceConfig
中,有这样一个构造函数
ResourceConfig(Class<?>... classes)
然后,配置web.xml
西华帝休息服务
org.glassfish.jersey.servlet.ServletContainer
javax.ws.rs.Application
foo.bar.RestConfig
1.
但最简单的方法是在web.xml
中注册实现类
西华帝休息服务
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.classnames
foo.bar.impl.MyServiceImpl
1.
你有没有想过这一点?我也有同样的问题。是的,但不是我怎么描述的。我们将资源类和服务类分开。资源类将“组成”服务对象引用。您可以遵循服务对象的继承原则。希望这能有所帮助。我发现这是Jersey的一个bug,当你让它使用包扫描自动搜索提供者/etc时。如果显式注册资源/提供程序类,则不会出现此错误。关于,我们还修复了Jersey不会尝试实例化接口的问题。
:这似乎还没有修复?我用的是2。13@RonanQuillevere,该手动绑定哪个文件。我已经习惯了SpringBoot,在那里你会遇到很多事情。这难道不会阻止你使用这个接口生成客户端代理吗?在我的例子中,我不得不扩展DefaultResourceConfig
bind(YourResource.class).to(YourResourceImpl.class);
ResourceConfig(Class<?>... classes)