Джерси: список объектов JSON - PullRequest
6 голосов
/ 04 октября 2011

Я пытаюсь получить в своей коллекции ресурсов класса реализации Джерси следующие объекты:

@POST
@Path("/send")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String sendEmails(ArrayList<AnyEmail> email) {
    //emailManager.sendEmail(email);
    return "success";
}

У меня есть @XmlRootElement над `AnyEmail.

Однако, когда я отправляю подобное с помощью инструмента REST client:

 emails : [
       {"body": "Testing the web service", "header": "Hi", "footer": "<br/>test"},
       {"body": "Testing the web service", "header": "Hi", "footer": "<br/>test"}
      ]

Я получаю:

<code><html><head><title>Apache Tomcat/7.0.22 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 500 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Exception report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>The server encountered an internal error () that prevented it from fulfilling this request.</u></p><p><b>exception</b> <pre>javax.servlet.ServletException: Servlet execution threw an exception

первопричина

java.lang.Error: Error: could not match input
    com.sun.jersey.json.impl.reader.JsonLexer.zzScanError(JsonLexer.java:491)
    com.sun.jersey.json.impl.reader.JsonLexer.yylex(JsonLexer.java:736)
</code>

EDITED
Сейчас я попробовал:

 "emails" : [
           {"body": "Testing the web service", "header": "Hi", "footer": "<br/>test"},
           {"body": "Testing the web service", "header": "Hi", "footer": "<br/>test"}
          ]

и я получаю:

    SEVERE: Servlet.service() for servlet [Jersey Web Application] in context with path [/API] threw exception
java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.ArrayList.get(ArrayList.java:324)
    at com.sun.jersey.json.impl.reader.JsonXmlStreamReader.valueRead(JsonXmlStreamReader.java:165)
    at com.sun.jersey.json.impl.reader.JsonXmlStreamReader.readNext(JsonXmlStreamReader.java:330)

Ответы [ 6 ]

7 голосов
/ 05 декабря 2012

Почему вы не используете простой массив Java ???

[
   {"body": "Testing the web service", "header": "Hi", "footer": "<br/>test"},
   {"body": "Testing the web service", "header": "Hi", "footer": "<br/>test"}
]

А затем следующий метод:

@POST
@Path("/send")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String sendEmails(AnyEmail[] emails) {
    //emailManager.sendEmail(emails);
    return "success";
}

Это должно сработать ...

4 голосов
/ 05 октября 2011

Вот что должно работать:

{
"anyEmail" : [
       {"body": "Testing the web service", "header": "Hi", "footer": "<br/>test"},
       {"body": "Testing the web service", "header": "Hi", "footer": "<br/>test"}
       ]
}

Также вы можете использовать подход POJO, который является предпочтительным для JSON - см. Здесь: https://jersey.java.net/documentation/1.18/json.html

Поддержка JSON, основанная на JAXB, имеет различные проблемы с некоторыми крайними случаями, поскольку не существует сопоставления 1: 1 между XML (JAXB как задумано) и JSON.

1 голос
/ 04 октября 2011

Я не являюсь экспертом по Джерси и Джсону, но вы пытались использовать полный объект JSON, например:

{
"emails" : [
       {"body": "Testing the web service", "header": "Hi", "footer": "<br/>test"},
       {"body": "Testing the web service", "header": "Hi", "footer": "<br/>test"}
      ]
}

(добавлены скобки и цитаты в электронные письма).

0 голосов
/ 29 октября 2015

Я использую Jersey 1.17 и могу без проблем получить список объектов JSON со следующей подписью и преобразовать их в список моих объектов POJO с помощью библиотеки gson от Google. Использование обертки для переноса списка объектов POJO, безусловно, неестественно и не выгодно.

   @POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({"application/x-javascript", MediaType.APPLICATION_JSON})
public Response doSomething(@Context HttpServletRequest httpServletRequest, JSONArray listOfJSONObjects) {
    Gson gson = new GsonBuilder().create();
    List < MYPOJOClass > myPojoObjectList = gson.fromJson(listOfJSONObjects.toString(), new TypeToken < List < MYPOJOClass >> () {}.getType());
0 голосов
/ 11 июня 2014

// Клиент

package com.project.rest.model;

import java.util.HashSet;
import java.util.Set;

public class Client {

    private Long id;
    private String email;
    private String lang;

    public Client() {
    }

    public Client(Long id) {
    this.id = id;
    }

    public Client(Long id, String email, String lang) {
    this.id = id;
    this.email = email;
    this.lang = lang;
    }

    public Long getId() {
    return id;
    }

    public void setId(Long id) {
    this.id = id;
    }

    public String getEmail() {
    return email;
    }

    public void setEmail(String email) {
    this.email = email;
    }

    public String getLang() {
    return lang;
    }

    public void setLang(String lang) {
    this.lang = lang;
    }


    @Override
    public String toString() {
    return "Client [id=" + id + ", email=" + email + ", lang=" + lang + "]";
    }

}

// ClientService

package com.project.rest;

import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import com.project.rest.model.Client;

@Path("/client")
public class ClientService {

    @POST
    @Path("/sendList")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response consumeJSONList(List<Client> clientList) {

        String output = "consumeJSONList Client : " + clientList.toString() + "\n\n";

        return Response.status(200).entity(output).build();
    }

}

// JerseyClient

package com.project.rest;

import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.core.MediaType;

import com.project.rest.model.Client;
import com.project.rest.model.Device;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.json.JSONConfiguration;

public class JerseyClient {

public static void main(String[] args) {

try {

    List<Client> clientList = new ArrayList<Client>();
    clientList.add(new Client(1L, "pruebas@pruebas.com", "es"));
    clientList.add(new Client(2L, "pruebas@pruebas.com", "es"));
    clientList.add(new Client(3L, "pruebas@pruebas.com", "es"));

    ClientConfig clientConfig = new DefaultClientConfig();

    clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);

    com.sun.jersey.api.client.Client c = com.sun.jersey.api.client.Client.create(clientConfig);

    WebResource webResource = c.resource("http://localhost:8080/project_rest/rest/client/sendList");

    ClientResponse response = webResource.accept("application/json").type("application/json").post(ClientResponse.class, clientList);

    if (response.getStatus() != 200) {
    throw new RuntimeException("Failed sendClientList: HTTP error code : " + response.getStatus());
    }

    String output = response.getEntity(String.class);

    System.out.println("sendClientList... Server response .... \n");
    System.out.println(output);

} catch (Exception e) {

    e.printStackTrace();

}
}
}

// pom.xml

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.8.2</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-bundle</artifactId>
    <version>1.10-b01</version>
</dependency>

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.17.1</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.17.1</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-servlet</artifactId>
    <version>1.17.1</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.18.1</version>
</dependency>
<dependency>
  <groupId>com.owlike</groupId>
  <artifactId>genson</artifactId>
  <version>0.99</version>
</dependency>

0 голосов
/ 07 марта 2012

У меня была такая же проблема. Вы должны обернуть класс AnyEmail.

Это может помочь вам: https://blogs.oracle.com/japod/entry/missing_brackets_at_json_one

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...