当前位置: 首页 > 面试题库 >

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

孔茂
2023-03-14
问题内容

服务类具有一个@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();
}

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


问题答案:

您可以使用com.sun.jersey.spi.inject.InjectableProvider

import java.util.List;
import java.util.Map.Entry;

import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.Provider;

import org.springframework.beans.BeanUtils;

import com.sun.jersey.api.core.HttpContext;
import com.sun.jersey.api.model.Parameter;
import com.sun.jersey.core.spi.component.ComponentContext;
import com.sun.jersey.core.spi.component.ComponentScope;
import com.sun.jersey.spi.inject.Injectable;
import com.sun.jersey.spi.inject.InjectableProvider;

@Provider
public final class ParameterBeanProvider implements InjectableProvider<QueryParam, Parameter> {

    @Context
    private final HttpContext hc;

    public ParameterBeanProvider(@Context HttpContext hc) {
        this.hc = hc;
    }

    @Override
    public ComponentScope getScope() {
        return ComponentScope.PerRequest;
    }

    @Override
    public Injectable<ParameterBean> getInjectable(ComponentContext ic, final QueryParam a, final Parameter c) {

        if (ParameterBean.class != c.getParameterClass()) {
            return null;
        }

        return new Injectable<ParameterBean>() {

            public ParameterBean getValue() {
                ParameterBean parameterBean = new ParameterBean();
                MultivaluedMap<String, String> params = hc.getUriInfo().getQueryParameters();
                // Populate the parameter bean properties
                for (Entry<String, List<String>> param : params.entrySet()) {
                    String key = param.getKey();
                    Object value = param.getValue().iterator().next();

                    // set the property
                    BeanUtils.setProperty(parameterBean, key, value);
                }
                return parameterBean;
            }
        };
    }
}

在您的资源中,您只需要使用@QueryParam("valueWeDontCare")

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

提供者将被自动调用。



 类似资料:
  • 我知道Struts2使用拦截器自动映射请求参数到动作类字段。但如果我想将一个参数映射到一个具有不同名称的操作字段,该怎么办。我想我有 如果我想将此映射到下面的字段 我怎么做这个映射。我能用吗 如果是的话,我如何在action类中获取请求对象?此外,它是否可以在带有OGNL表达式或的JSP页面中工作?在struts2配置中有没有其他方法来做这种映射?

  • 我的动机如下: 清晰度:我不希望客户端对请求参数进行粗指处理,但仍然返回结果(就像没有提供请求参数一样) HTTP缓存:我希望限制服务的有效HTTP路由数,以便HTTP缓存(即varnish)更好地工作 例如,我可能有一个简单的控制器,它被配置为接受一个: 我现在希望我的应用程序接受请求并返回OK响应: 但我希望我的应用程序注意到还有其他未计算的请求参数,并返回一个错误响应代码。

  • null 建议在相关的线程入口控制器中设置,但似乎只能由群集管理员设置。 我可以使用两条路由,并为每条路由设置一个单独的cookie,但这似乎是不对的--为什么必须为两个域使用两个cookie,而实际上只有一个域具有一个身份验证? 切换到令牌身份验证? 那么,我错过了什么?处理这个问题的最佳方法是什么?

  • 问题内容: 这个问题不太可能对将来的访客有所帮助;它仅与较小的地理区域,特定的时间段或极为狭窄的情况(通常不适用于Internet的全球受众)有关。要获得使该问题更广泛适用的帮助,请访问帮助中心。 6年前关闭。 我有一个mysql查询,但无法为其绑定参数 我已经试过了 但我收到了并且出错了: 警告:mysqli_stmt :: bind_param():类型定义字符串中的元素数量与绑定变量的数量不

  • 如何在Spring Data Jpa中将映射映射到存储库中的查询? 下面是我的通用存储库源代码。 如下所示,我希望接收queryParams作为参数,并将queryParams对应的键和值映射到where子句。 因为它是一个GenericRepository,所以无法实现,我想把映射的内容放在@Query中。 我一直在搜索,但我找不到任何关于它的信息,所以我不知道如何解决这个问题。 如果有办法,请

  • 我有两个实体,并使用多对一注释来映射它们,但是在使用另一个表id编写了查找对象的查询后,当我注释掉调用该应用程序的行和方法时,出现了一个错误,但是我想实现该功能,请帮助我 这些是我的实体类: 第二个实体 我的合同服务类 我的合同存储库 我在运行项目时遇到此错误 org.springframework.beans.factory.未满足的依赖异常:创建名称为“合同控制器”的bean时出错:通过字段“