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

sme*_*eeb 8 java url jax-rs jersey

说我希望我的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
Run Code Online (Sandbox Code Playgroud)

假设我想/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...
}
Run Code Online (Sandbox Code Playgroud)

FizzResource在暴露/app/fizz或只/fizz

cas*_*lin 17

简短的回答

FizzResource将暴露在/app/fizz.

答案很长

引用JSR 339(关于注释继承的3.6节):

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

规范还指出:

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

创建子资源

JAX-RS /泽西文档介绍了如何创建子资源:

/fizz 可以在类上使用,这样的类称为根资源类.

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

第一种方式/fizz可以用于资源方法,这种方法称为子资源方法.

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

@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
    }
}
Run Code Online (Sandbox Code Playgroud)