泽西岛的团体请求

时间:2016-01-28 15:35:36

标签: java 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并不存在,但最好的做法是不写#A; SchoolA"在每个资源类? :d

2 个答案:

答案 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)。 您必须通过覆盖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