泽西@Path无法处理问号('?')

时间:2011-11-14 08:29:14

标签: java rest jersey

我有两个REST网址,如:

http://myschool/student/jack //get student information.
http://myschool/student/jack?books //get student books.

代码:

@Path("student")
public class StudentResource {

    @GET
    @Path("{name}")
    public Response getInformation(@PathParam("name") String name) {
        return Response.ok(loadStudentInformation(name));
    }

    @GET
    @Path("{name}?books") //ineffective expression
    public Response getBooks(@PathParam("name") String name) {
        return Response.ok(loadStudentBooks(name));
    }

泽西岛不能处理第二个网址'http:// myschool / student / jack?books',它总是以第一种方法'getInformation'发送以'?books'结尾的传入请求。

我尝试使用这样的正则表达式:

    @GET
    @Path("{name : .*(\\?books$)}") //ineffective expression
    public Response getBooks(@PathParam("name") String studentName) {

正则表达式也是无效的,有人可以帮我弄清楚如何实现它。

感谢。

2 个答案:

答案 0 :(得分:3)

如果您确实需要使用问号分隔{name}和书籍,可以按以下方式进行:

@GET
@Path("{name}")
public Response getInformation(@PathParam("name") String name, @QueryParam("books") String books) {
    if (books != null) {
        // "books" was included after the question mark
        return getBooks(name);
    } else {
        // "books" was not included after the question mark
        return Response.ok(loadStudentInformation(name));
    }
}

public Response getBooks(String name) {
    return Response.ok(loadStudentBooks(name));
}

更新:另外,如果您使用的问号斜杠更合适(根据规范,问号开始查询参数部分),作为另一种选择,您可以考虑编写一个替换问号的ContainerRequestFilter斜杠请求 - 这将允许您在不破坏API兼容性的情况下设计您的资源,而不会破坏API兼容性。

过滤器可以这么简单:

public class QueryParamToPathSegmentFilter implements ContainerRequestFilter {

    @Override
    public ContainerRequest filter(ContainerRequest request) {
        String requestUri = request.getRequestUri().toString();
        requestUri = requestUri.replace('?', '/');
        request.setUris(request.getBaseUri(), UriBuilder.fromUri(requestUri).build());
        return request;
    }

}

取决于您的URI的外观 - 您可以使其更复杂。 以下是有关如何在应用程序中注册过滤器的更多信息: http://jersey.java.net/nonav/apidocs/latest/jersey/com/sun/jersey/api/container/filter/package-summary.html

答案 1 :(得分:0)

您可以将路径设置为:

@Path("{name}/books")

而不是:

@Path("{name}?books")

然后你就可以获得该网址上的图书清单:

http://myschool/student/jack/books //get student books.

URL中的问号通常意味着您要将参数传递给服务(在这种情况下,您希望使用QueryParam),但我不认为这就是它的内容,你只想创建一个不同的服务。