说我希望我的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
?
答案 0 :(得分:15)
FizzResource
将在/fizz
公开。
引用JSR 339(关于注释继承的 3.6 部分):
如果子类或实现方法具有任何 JAX-RS注释 所有超类或接口方法上的注释都是 忽略。
为了与其他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资源。