JAX-RS / Jersey资源路径是否值得继承?

时间:2015-11-13 13:53:03

标签: java url jersey jax-rs

说我希望我的JAX-RS / Jersey应用程序公开以下URL:

http://myapp.example.com/app/fizz
http://myapp.example.com/app/buzz
http://myapp.example.com/app/foo
http://myapp.example.com/app/bar

假设我希望/app成为父基础资源,/app/*成为“子”资源。以下是否会完成我正在寻找的URL策略(?):

@Path('/app')
@Produces(MediaType.APPLICATION_JSON)
public abstract class AppResource {
    // Whatever...
}

@Path('/fizz') // <--- right here, will FizzResource live at /app/fizz?
@Produces(MediaType.APPLICATION_JSON)
public class FizzResource extends AppResource {
    // Whatever...
}

FizzResource/app/fizz还是仅/fizz

3 个答案:

答案 0 :(得分:15)

简短回答

FizzResource将在/fizz公开。

答案很长

引用JSR 339(关于注释继承 3.6 部分):

  

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

specification也说:

  

为了与其他Java EE规范保持一致,建议始终重复注释,而不是依赖注释继承

创建子资源

JAX-RS/Jersey documentation解释了如何创建子资源:

  

@Path可以在类上使用,这类被称为根资源类。

     

@Path也可用于根资源类的方法。这使得许多资源的通用功能可以组合在一起并可能被重用。

     

可以使用@Path的第一种方式是资源方法,这种方法称为子资源方法

因此,请执行以下操作来创建子资源:

@Path("/app")
public class YourHandler {

    @Produces(MediaType.APPLICATION_JSON)
    public String yourHandlerForApp() {
        // This method is be exposed at /app
    }

    @Path("/fizz") 
    @Produces(MediaType.APPLICATION_JSON)
    public String yourHandlerForAppSlashFizz() {
        // This method is be exposed at /app/fizz
    }
}

答案 1 :(得分:0)

你想要的是

@Path("/app")
public class YourHandler {
   @Path('/')
   @Produces(MediaType.APPLICATION_JSON)
   public String yourHandlerForApp() {
      // Whatever...
   }

   @Path('/fizz') // <--- right here, will FizzResource live at /app/fizz?
   @Produces(MediaType.APPLICATION_JSON)
   public String yourHandlerForAppSlashFizz() {
       // Whatever...
   }
}

答案 2 :(得分:0)

我认为给出的答案对于原始问题陈述不是最好的。

他希望将自己的子资源放在单独的类中。这是可以理解和令人钦佩的,因为不这样做将意味着将他的所有端点都放在同一个类中,这将是巨大的。

如果该端口上的所有端点都以/app开头,那么我认为最好的方法是配置过滤器以将其放入@ApplicationPath中。

如果不是所有端点都以相同的前缀开头,那么您将不得不使用这种风格的JAX-RS子资源,在其中您指定@Path而不是HTTP方法注释({{1} }等),然后返回您要委派给的资源的实例:

@GET

JAX-RS documentation中提供了这种资源处理方法。

您还可以让所有子资源将其路径声明为

@Path("/app")
public class AppResource {
    @Context UriInfo uriInfo;

    @Path("fizz")
    public FizzResource getItemContentResource() {
        return new FizzResource ();
    }
}

@Produces(MediaType.APPLICATION_JSON)
public class FizzResource extends AppResource {
    // Whatever...
}

@Path(BASE_URL + "/fizz") 是一个静态字符串,但我会尽量避免这种情况,因为对BASE_URL使用一个不完全恒定的参数似乎会导致我见过的每个JAX-RS IDE插件问题。他们无法计算实际路径,因此他们放弃了。因此,您可能无法拥有“ JAX-RS视图”,该视图无法通过路径可视化/导航JAX-RS资源。