如何在使用Jersey

时间:2016-11-29 22:32:34

标签: java rest jersey jax-rs jersey-2.0

这个问题曾被问过几次before,但是答案似乎没有用,而且/或者泽西岛已经进行了更多改变。

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

  

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

暗示这样做是完全可以的。在许多情况下,最好使用一个接口,并让服务器和客户端各自具有各自的实现。

那里有很多解决方案,

  1. 使用ResourceConfig并执行registerClasses(MyImplementation.class)。但是,这不起作用。
  2. web.xml中停用软件包扫描配置,创建自定义javax.ws.rs.Application并从那里执行register您的实施。不行。
  3. 使用ResourceConfig并定义自定义AbstractBinder并执行bind,以便Jersey的依赖注入可以找到具体的实现。不行。
  4. 使用RESTEasy。 RESTEasy似乎没有像泽西岛那样强加接口限制。从来没有尝试过。
  5. 如果有人可以分享他们的经验,我将不胜感激。任何有关如何让泽西岛工作的帮助也会很棒。至于选项(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

2 个答案:

答案 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。