如何将动态Bean参数注入Jersey方法?

时间:2013-09-03 08:36:44

标签: java spring jersey jax-rs jersey-2.0

我正在使用Jersey 2.0和Spring开发一个Web服务。

我希望能够将bean注入我的方法中。可以使用@BeanParam获取Bean参数。但是,我需要注入一个“动态”bean。我需要这个bean来包含传递给方法的所有查询参数。

例如,如果我发出请求GET /posts?title=lorem&date=2011-01-01&tag=game

我有一个像

这样的方法
@Path('/posts')
public class PostService{
    @GET
    public Response getAll(@QueryParam("page") int page,
        @QueryParam("pageSize") int pageSize,
        @BeanParam SearchParameters sp){

        sp.getTitle();
        sp.getDate();
        sp.getTag();
    }
}

我可能更容易获得查询参数Map<String, String>的地图。

1 个答案:

答案 0 :(得分:0)

@BeanParam允许将更多可注入参数放入一个bean(POJO),因此资源方法,资源方法构造函数或资源类中的许多可注入字段中没有这么多可注入参数。您可以将它们封装到使用@BeanParam注入的bean中。这涉及@HeaderParam,@ QueryParam等参数。但您也可以将ContainerRequestContext,UriInfo,SecurityContext或任何其他可注入对象注入到bean中。

但是,在您的情况下,您需要使用查询参数的映射,因为您需要所有参数,而不仅仅是之前已知的特定参数。为了获得它们,您可以注入UriInfo并从中获取查询参数:

@GET
public Response get(@Context UriInfo uriInfo) {
    MultivaluedMap<String, String> queryParameters = uriInfo.getQueryParameters();
    String myParam = queryParameters.getFirst("myParam");    
    ...
}

或者您可以使用@BeanParam并将@UriInfo注入bean。