泽西岛的团体要求

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)。 并且您必须通过覆盖 getClassesgetSingletons 方法在每个子类中显式配置资源:

@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