Web services 与jersey的restful服务接口

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"

我可以用接口和实现类创建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") 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)