我正在使用JAX-RS和Apache CXF开发宁静的Web服务。杰克逊在类路径中,但是我不确定Apache CXF是否使用相同的序列化/反序列化类。我正在尝试发布一个对象(DTO),它是一个内部静态类,看起来像这样:
@XmlRootElement(name = "dto")
public static class DTO implements Comparable<DTO>, Cloneable{
private long id;
private String name;
private Collection<Class1> obj1;
private Collection<Class2> obj2;
@JsonDeserialize(as=SomeConcreteClass.class)
private Collection<String, Class3> obj3;
//getters and setters
}
Class1,Class2和Class3也是DTO类所在的外部类中的内部静态类。其中的类(包括我的DTO类)不使用任何JSON注释进行注释,而仅使用XML注释(例如@XmlRootElement和@XMLType)进行注释。是否应使用@JsonTypeName之类的JSON注释对DTO类以及Class1,Class2和Class3进行注释?
还有另一个内部类(在同一外部类内),它包含上述DTO的集合,看起来像这样:
@XmlRootElement(name = "dtos")
@XmlType(name = "DTOsType")
public static class DTOs{
@JsonProperty("dtos")
private Collection<DTO> values;
public DTOs() {
}
public DTOs(final Collection<DTO> values) {
this.values = values;
}
@JsonProperty("dtos")
@XmlElement(name = "dto")
public Collection<DTO> getValues() {
return values;
}
@JsonProperty("dtos")
public void setValues(final Collection<DTO> values) {
this.values = values;
}
}
obj1和obj2内部是TreeSet,而obj3内部是TreeMap。
在服务器端,我的端点如下
@POST
@Path("{name}/endpoint")
@Consumes({ MediaType.APPLICATION_XML, MediaType.TEXT_XML,
MediaType.APPLICATION_JSON })
@Produces({ MediaType.TEXT_PLAIN, MediaType.APPLICATION_XML,
MediaType.TEXT_XML, MediaType.APPLICATION_JSON })
public Response addDTO(@PathParam("name") String name, DTOs dtos) {
//code here
...........
...........
}
JSON输入如下所示
{
"dtos":
{
"dto":
{
"class1s":
{
"class1": [
{
.......
},
{
........
}
]},
"name": "somename",
"class3s":
{
"class3":
{
.........
}
},
"id": 555589024908,
}
}
现在,当我通过邮递员在请求正文中发送JSON时,出现以下错误
Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT
token
at [Source: (org.apache.cxf.transport.http.AbstractHTTPDestination$1); line:
3, column: 1] (through reference chain: my DTO class ["dto"])
我已经经历过了:
Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
我不确定如何编写包装器或将JSON作为字符串发送到我的后端REST方法。问题在于反序列化部分由框架处理。
此服务与XML输入一起很好地工作。
有指针吗?
谢谢!