java - 将所有 `@QueryParam` 映射到 `JSON` 数据结构

标签 java json jax-rs classcastexception query-string

我正在尝试将我的 JAX-RS Jersey 应用程序的所有 @QueryParam 映射到 JSON 数据结构,如下所示:

@GET
@Produces("application/json")
@Path("/submit")
public String submit(@Context UriInfo info) {
    MultivaluedMap<String, String> params = info.getQueryParameters();

    JSONObject toInsert = new JSONObject();
    toInsert.accumulate("id", params.get("id").get(0));
    toInsert.accumulate("user", params.get("user").get(0));

    //params.remove("id");      have also like to delete these two
    //params.remove("user");    to avoid having duplicates in
    //                          the next rows

    JSONArray questions = new JSONArray();
    for (Entry<String, List<String>> entry : params.entrySet()){
        String[] values = (String[]) entry.getValue().toArray();
        String key = entry.getKey();
        questions.put(key, values);

    } 

    toInsert.accumulate("questions", questions);

    return toInsert;
}

不幸的是我遇到了异常

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
rest.Forms.submit(Forms.java:195)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:171)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:195)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104)
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:406)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:350)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:106)
org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:259)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
org.glassfish.jersey.internal.Errors.process(Errors.java:315)
org.glassfish.jersey.internal.Errors.process(Errors.java:297)
org.glassfish.jersey.internal.Errors.process(Errors.java:267)
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:320)
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:236)
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1028)
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:219)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

阅读 this 后我还尝试了以下操作,它不会抛出异常,但结果在语义上是错误的。 如果我按如下方式替换内部 for 循环:

    for (Entry<String, List<String>> entry : params.entrySet()){
        List<String> values = entry.getValue();
        String key = entry.getKey();
        Object[] objectArray = values.toArray();
        questions.put(key, Arrays.copyOf(objectArray, objectArray.length, String[].class));
    } 

这种情况下的结果仅作为键列表组成在“问题”部分中,并且我还想要关联的值。 预先感谢您

{ "id" : "f5475dc0-c8ce-11e3-9c1a-0800200c9a66",
  "questions" : [ "id",
      "l_name",
      "f_name",
      "citizenship",
      "like",
      "user"
    ],
  "user" : "gigi"
}

最佳答案

您实际上无法以这种方式转换 toArray() 的输出。您需要向 toArray() 调用提供类型,以便它返回适当类型的数组。

例如:

    List<String> list = new ArrayList<String>();
    list.add("foo");
    list.add("bar");
    String[] arr1 = (String[]) list.toArray(); // this throws a ClassCastException
    String[] arr2 = list.toArray(new String[0]); // this works

你只需要替换这一行

        String[] values = (String[]) entry.getValue().toArray();

用这个

        String[] values = entry.getValue().toArray(new String[0]);

并且您的代码应该可以工作。

关于java - 将所有 `@QueryParam` 映射到 `JSON` 数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23770188/

相关文章:

java - NewRelic - Java 代理检查旧包是否未被使用

jquery - 如何使用 jQuery 将查询字符串或 JSON 对象映射转换为单个 JSON 对象?

java - JAX-RS:Stateless、Singleton、RequestScoped 混淆

java - 如何从先前的 Activity 通知当前的 Activity

java - java错误: method does not override or implement a method from a supertype

Java HashMap.get(Object) 无限循环

json - Dockerrun.aws.json 版本无效,中止部署

android - 如何从 Retrofit2 调用 OnResponse 返回 Java 对象

java - 如何进行动态RESTful服务调用?

java - JAX-RS 默认的@Produces