如果应用程序是使用多个组件构建的,那么是否有办法为组件内的资源提供@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并不存在,但最好的做法是不写#A; SchoolA"在每个资源类? :d
答案 0 :(得分:0)
是的,通常如果您使用的是Jersey,则必须为每个组件定义一个扩展javax.ws.rs.coreApplication
的Application类。在本课程中,您还必须定义@ApplicationPath
。
例如:
@ApplicationPath("/my-base-url-for-my-component")
public class MyComponent extends Application {}
MyComponent中定义的所有资源都将以/my-base-url-for-my-component
为前缀。
答案 1 :(得分:0)
您可以在一个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。