resteasy:如何在resteasy服务api中使用Map作为QueryParam

时间:2015-02-23 16:42:42

标签: java json jboss jax-rs resteasy

您好我正在使用resteasy api,我需要使用Map作为QueryParam。我可以使用list作为QueryParam,但是当我尝试传递Map时,我得到下面提到的错误。

这是我的服务代码

@GET
@Path("/movies")
@Produces(MediaType.APPLICATION_JSON)
public SolrDocumentList getPropertiesByKeyword1(@QueryParam("filterMap") final Map<String,String> list)
 {}

[org.jboss.resteasy.core.ExceptionHandler](http- / 0.0.0.0:18080-1)执行POST / solr / search / properties失败:org.jboss.resteasy.spi.ReaderException:org.codehaus。 jackson.map.JsonMappingException:无法实例化类型的值[map type; class java.util.LinkedHashMap,[simple type,class java.lang.String] - &gt;来自JSON String的[simple type,class java.lang.String]];没有单字符串构造函数/工厂方法(通过引用链:com.rentr.solr.SearchRequestDto [“filterMap”])     在org.jboss.resteasy.core.MessageBodyParameterInjector.inject(MessageBodyParameterInjector.java:183)[resteasy-jaxrs-3.0.6.Final.jar:]     at org.jboss.resteasy.core.MethodInjectorImpl.injectArguments(MethodInjectorImpl.java:88)[resteasy-jaxrs-3.0.6.Final.jar:]     在org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:111)[resteasy-jaxrs-3.0.6.Final.jar:]     在org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:280)[resteasy-jaxrs-3.0.6.Final.jar:]     在org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:234)[resteasy-jaxrs-3.0.6.Final.jar:]     在org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:221)[resteasy-jaxrs-3.0.6.Final.jar:]     在org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356)[resteasy-jaxrs-3.0.6.Final.jar:]     在org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179)[resteasy-jaxrs-3.0.6.Final.jar:]     在org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220)[resteasy-jaxrs-3.0.6.Final.jar:]

我们可以使用Map作为QueryParam,如果是,那么如何?

1 个答案:

答案 0 :(得分:2)

注入的值不是Map。使用Map,您建议会有不同的密钥,而实际上只有一个密钥"filter"。因此,您使用Map

而不是List<String>
@Path("list")
public class QueryParamMapResource {

    @GET
    public Response getQueryParams(@QueryParam("filter") List<String> params) {
        StringBuilder builder = new StringBuilder("Filter Params: ");
        for (String value : params) {
            builder.append(value).append(",");
        }
        return Response.ok(builder.toString()).build();
    }
}
  

C:\>curl "http://localhost:8080/test/rest/list?filter=hello&filter=world"
  结果: Filter Params: hello,world,


另一种选择是从UriInfo获取所有查询参数(似乎没必要,只显示选项: - )

@GET
public Response getQueryParams(@Context UriInfo uriInfo) {
    MultivaluedMap<String, String> queryMap = uriInfo.getQueryParameters();
    StringBuilder builder = new StringBuilder("Filter Params: ");
    List<String> params = queryMap.get("filter");
    for (String value : params) {
        builder.append(value).append(",");
    }
    return Response.ok(builder.toString()).build();
}

queryMap开始,您可以尝试按键获取查询参数值,并返回该键值的列表