嗨,我正在使用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; JSON字符串中的类java.util.LinkedHashMap,[简单类型,类java.lang.String]-> [简单类型,类java.lang.String]];没有单字符串构造函数/工厂方法(通过参考链:com.rentr.solr.SearchRequestDto [“ filterMap”])
在org.jboss.resteasy.core.MessageBodyParameterInjector.inject(MessageBodyParameterInjector.java:183)[resteasy-jaxrs-3.0.6.Final.jar:]
在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吗?
最佳答案
注入的值将不是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
尝试通过键获取查询参数值,它将返回该键的值列表。