我正在尝试在我的Jersey实现资源类中检索这样的对象集合:
@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客户端工具发布这样的内容时:
emails : [
{"body": "Testing the web service", "header": "Hi", "footer": "<br/>test"},
{"body": "Testing the web service", "header": "Hi", "footer": "<br/>test"}
]
我明白了:
<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
</pre></p><p><b>root cause</b> <pre>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)
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)
答案 0 :(得分:7)
为什么不使用简单的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";
}
应该这样做......
答案 1 :(得分:4)
这应该是有用的:
{
"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
基于JAXB的JSON支持在一些边缘情况下存在各种问题,因为XML(JAXB设计用于)和JSON之间没有1:1的映射。
答案 2 :(得分:1)
我既不是泽西也不是Json专家,但你是否尝试使用完整的JSON对象,即:
{
"emails" : [
{"body": "Testing the web service", "header": "Hi", "footer": "<br/>test"},
{"body": "Testing the web service", "header": "Hi", "footer": "<br/>test"}
]
}
(添加大括号和电子邮件的引号)。
答案 3 :(得分:0)
我遇到了同样的问题。你必须包装AnyEmail类。
这可以帮助您:https://blogs.oracle.com/japod/entry/missing_brackets_at_json_one
答案 4 :(得分:0)
//客户端
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>
答案 5 :(得分:0)
我正在使用Jersey 1.17并且可以接收带有以下签名的JSON对象列表,并使用Google的gson库将它们转换为我的POJO对象列表,没有任何问题。使用包装器来包装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());