I have a REST service built with Jersey and deployed in the AppEngine. The REST service implements the verb PUT that consumes an application/json
media type. The data binding is performed by Jackson.
The verb consumes an enterprise-departments relation represented in JSON as
{"name":"myEnterprise", "departments":["HR","IT","SC"]}
On the client side, I use gson to convert the JSON representation into a java object. Then, I pass the object to my REST service and it works fine.
Problem:
When my JSON representation has only one item in the collection
{"name":"myEnterprise", "departments":["HR"]}
the service cannot deserialize the object.
ATTENTION: /enterprise/enterprise: org.codehaus.jackson.map.JsonMappingException:
Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token at
[Source: org.mortbay.jetty.HttpParser$Input@5a9c5842; line: 1, column: 2
As reported by other users, the solution is to add the flag ACCEPT_SINGLE_VALUE_AS_ARRAY
(e.g., Jersey: Can not deserialize instance of ArrayList out of String). Nevertheless, I am not controlling an ObjectMapper
because in the service side it is transparently made by Jackson.
Question:
Is there a way to configure the ObjectMapper
on the service side to enable ACCEPT_SINGLE_VALUE_AS_ARRAY
? annotations? web.xml
?
Code details
Java object:
@XmlRootElement
public class Enterprise {
private String name;
private List<String> departments;
public Enterprise() {}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getDepartments() {
return departments;
}
public void setDepartments(List<String> departments) {
this.departments = departments;
}
}
The REST service side:
@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/enterprise")
public Response putEnterprise(Enterprise enterprise,
@Context HttpServletRequest req){
...
}
Client side:
...
String jsonString = "{"name":"myEnterprise", "departments":["HR"]}";
Enterprise enterprise = gson.fromJson(jsonString, Enterprise.class);
System.out.println(gson.toJson(enterprise));
response = webResource
.type(MediaType.APPLICATION_JSON)
.put(ClientResponse.class,enterprise);
if (response.getStatus() >= 400) {
throw new RuntimeException("Failed : HTTP error code : " + response.getStatus());
}
...
See Question&Answers more detail:
os