泽西岛的团体要求
Group Requests in Jersey
如果一个应用程序是由多个组件构建的,有没有办法为组件内的资源添加一个@Path 前缀?
举个例子,让我们考虑从一个城市检索关于几所大学的信息的服务。组件将是 schoolA 和 schoolB。
amsterdam-schools.com/schoolA/students/
amsterdam-schools.com/schoolA/teachers/
amsterdam-schools.com/schoolA/teachers/{id}
amsterdam-schools.com/schoolA/teachers/{id}/courses
...
amsterdam-schools.com/schoolB/teachers
amsterdam-schools.com/schoolB/students
...
是否可以实现类似下面代码的东西?
@Path("/schoolA")
public abstract class SchoolA {
// ...
}
@Path(@SuperPath + "/teachers")
public class TeacherListResource extends SchoolA {
@Path("/{id}")
public Response get(@PathParam("id") Integer teacherId) {
// ...
}
// ...
}
我知道@SuperPath 不存在,但是最好不要在每个资源 class 中写 "SchoolA" 是什么? :D
是的,通常如果您使用 Jersey,您必须为每个组件定义一个扩展 javax.ws.rs.coreApplication
的应用程序 class。在此 class 中,您还必须定义一个 @ApplicationPath
。
例如:
@ApplicationPath("/my-base-url-for-my-component")
public class MyComponent extends Application {}
MyComponent 中定义的所有资源都将带有前缀 /my-base-url-for-my-component
。
您可以在一个 WAR 中部署多个具有不同 URI 的 JAX-RS 应用程序。
您必须为每个此类应用程序创建一个 javax.ws.rs.core.Application
子类(或为此目的使用 web.xml
)。
并且您必须通过覆盖 getClasses
或 getSingletons
方法在每个子类中显式配置资源:
@Path("first")
public class FirstResource {
@GET
public String first() {
return "first";
}
}
@ApplicationPath("one")
public class JAXRSConfigurationOne extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new HashSet<>();
resources.add(FirstResource.class);
return resources;
}
}
@Path("second")
public class SecondResource {
@GET
public String first() {
return "second";
}
}
@ApplicationPath("two")
public class JAXRSConfigurationTwo extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new HashSet<>();
resources.add(SecondResource.class);
return resources;
}
}
两个 JAX-RS 应用程序都可以通过不同的 URI 访问:
详情请看here。
如果一个应用程序是由多个组件构建的,有没有办法为组件内的资源添加一个@Path 前缀?
举个例子,让我们考虑从一个城市检索关于几所大学的信息的服务。组件将是 schoolA 和 schoolB。
amsterdam-schools.com/schoolA/students/
amsterdam-schools.com/schoolA/teachers/
amsterdam-schools.com/schoolA/teachers/{id}
amsterdam-schools.com/schoolA/teachers/{id}/courses
...
amsterdam-schools.com/schoolB/teachers
amsterdam-schools.com/schoolB/students
...
是否可以实现类似下面代码的东西?
@Path("/schoolA")
public abstract class SchoolA {
// ...
}
@Path(@SuperPath + "/teachers")
public class TeacherListResource extends SchoolA {
@Path("/{id}")
public Response get(@PathParam("id") Integer teacherId) {
// ...
}
// ...
}
我知道@SuperPath 不存在,但是最好不要在每个资源 class 中写 "SchoolA" 是什么? :D
是的,通常如果您使用 Jersey,您必须为每个组件定义一个扩展 javax.ws.rs.coreApplication
的应用程序 class。在此 class 中,您还必须定义一个 @ApplicationPath
。
例如:
@ApplicationPath("/my-base-url-for-my-component")
public class MyComponent extends Application {}
MyComponent 中定义的所有资源都将带有前缀 /my-base-url-for-my-component
。
您可以在一个 WAR 中部署多个具有不同 URI 的 JAX-RS 应用程序。
您必须为每个此类应用程序创建一个 javax.ws.rs.core.Application
子类(或为此目的使用 web.xml
)。
并且您必须通过覆盖 getClasses
或 getSingletons
方法在每个子类中显式配置资源:
@Path("first")
public class FirstResource {
@GET
public String first() {
return "first";
}
}
@ApplicationPath("one")
public class JAXRSConfigurationOne extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new HashSet<>();
resources.add(FirstResource.class);
return resources;
}
}
@Path("second")
public class SecondResource {
@GET
public String first() {
return "second";
}
}
@ApplicationPath("two")
public class JAXRSConfigurationTwo extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new HashSet<>();
resources.add(SecondResource.class);
return resources;
}
}
两个 JAX-RS 应用程序都可以通过不同的 URI 访问:
详情请看here。