无法反序列化 java.util.ArrayList 的实例,VALUE_STRING
2022-08-31 14:43:38
我有一个使用泽西岛构建的REST服务,并部署在AppEngine中。REST 服务实现使用媒体类型的谓词 PUT。数据绑定由 Jackson 执行。application/json
该谓词使用在 JSON 中表示的企业-部门关系,如下所示
{"name":"myEnterprise", "departments":["HR","IT","SC"]}
在客户端,我使用gson将JSON表示形式转换为java对象。然后,我将对象传递给我的 REST 服务,它工作正常。
问题:
当我的 JSON 表示形式在集合中只有一个项目时
{"name":"myEnterprise", "departments":["HR"]}
服务无法反序列化对象。
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
正如其他用户所报告的那样,解决方案是添加标志(例如,泽西岛:无法从字符串中反序列化ArrayList的实例)。然而,我没有控制一个,因为在服务方面,它是由杰克逊透明地制造的。ACCEPT_SINGLE_VALUE_AS_ARRAY
ObjectMapper
问题:
有没有办法在服务端配置启用 ?附注??ObjectMapper
ACCEPT_SINGLE_VALUE_AS_ARRAY
web.xml
代码详细信息
Java 对象:
@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;
}
}
REST 服务端:
@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/enterprise")
public Response putEnterprise(Enterprise enterprise,
@Context HttpServletRequest req){
...
}
客户端:
...
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());
}
...