如何将多个查询参数映射到 Jersey GET 请求上 Bean 的字段?

2022-08-31 17:43:13

服务类具有接受多个参数的操作。这些参数作为查询参数传递到服务调用。@GET@GET

@GET
@Path("find")
@Produces(MediaType.APPLICATION_XML)
public FindResponse find(@QueryParam("prop1") String prop1, 
                         @QueryParam("prop2") String prop2, 
                         @QueryParam("prop3") String prop3, 
                         @QueryParam("prop4") String prop4, ...) 

这些参数的列表正在增长,因此我想将它们放入包含所有这些参数的单个bean中。

@GET
@Path("find")
@Produces(MediaType.APPLICATION_XML)
public FindResponse find(ParameterBean paramBean) 
{
    String prop1 = paramBean.getProp1();
    String prop2 = paramBean.getProp2();
    String prop3 = paramBean.getProp3();
    String prop4 = paramBean.getProp4();
}

你会怎么做?这有可能吗?


答案 1

Jersey 2.0 中,您需要使用 BeanParam 以正常的 Jersey 风格无缝提供您正在寻找的内容。

从上面链接的文档页面中,您可以使用BeanParam执行以下操作:

@GET
@Path("find")
@Produces(MediaType.APPLICATION_XML)
public FindResponse find(@BeanParam ParameterBean paramBean) 
{
    String prop1 = paramBean.prop1;
    String prop2 = paramBean.prop2;
    String prop3 = paramBean.prop3;
    String prop4 = paramBean.prop4;
}

然后将包含:ParameterBean.java

public class ParameterBean {
     @QueryParam("prop1") 
     public String prop1;

     @QueryParam("prop2") 
     public String prop2;

     @QueryParam("prop3") 
     public String prop3;

     @QueryParam("prop4") 
     public String prop4;
}

我更喜欢参数bean上的公共属性,但如果您愿意,也可以使用getters/setters和私有字段。


答案 2

试试这样的东西。使用 UriInfo 将所有请求参数获取到映射中,并尝试访问它们。这是在传递单个参数的地方完成的。

// showing only the relavent code
public FindResponse find( @Context UriInfo allUri ) {
    MultivaluedMap<String, String> mpAllQueParams = allUri.getQueryParameters();
    String prop1 = mpAllQueParams.getFirst("prop1");
}

推荐