Instanz von java.util.ArrayList kann nicht aus VALUE_STRING deserialisiert werden
Ich habe einen REST-Service mit Jersey erstellt und in der AppEngine bereitgestellt. Der REST-Service implementiert das Verb PUT, das einen application / json-Medientyp verwendet. Die Datenbindung wird von Jackson durchgeführt.
Das Verb verbraucht eine Beziehung zwischen Unternehmen und Abteilungen, die in JSON als dargestellt wird
{"name":"myEnterprise", "departments":["HR","IT","SC"]}
Auf der Clientseite verwende ich gson, um die JSON-Darstellung in ein Java-Objekt zu konvertieren. Dann übergebe ich das Objekt an meinen REST-Service und es funktioniert einwandfrei.
Problem:
Wenn meine JSON-Darstellung nur ein Element in der Sammlung hat
{"name":"myEnterprise", "departments":["HR"]}
Der Dienst kann das Objekt nicht deserialisieren.
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
Wie von anderen Benutzern gemeldet, besteht die Lösung darin, das Flag ACCEPT_SINGLE_VALUE_AS_ARRAY hinzuzufügen (z. B.Jersey: Instanz von ArrayList kann nicht aus String deserialisiert werden). Trotzdem steuere ich keinen ObjectMapper, da er auf der Serviceseite transparent von Jackson erstellt wird.
Frage:
Gibt es eine Möglichkeit, den ObjectMapper auf der Serviceseite so zu konfigurieren, dass ACCEPT_SINGLE_VALUE_AS_ARRAY aktiviert wird? Anmerkungen? web.xml?
Code-Details
Java-Objekt:
@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;
}
}
Die REST-Serviceseite:
@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/enterprise")
public Response putEnterprise(Enterprise enterprise,
@Context HttpServletRequest req){
...
}
Client Seite:
...
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());
}
...