我有Jersey PUT webservice,它采用包含多个对象数组的JSON/xml(如下所示)作为输入。嵌套在JSON对象中的嵌套数组属性为null
{
"a" : [{"p1":"x1"},{"p2":"x2"}],
"b" : [{"q1":"y1"},{"q2":"y2"}],
"c" : [{"r1":"z1"},{"r2":"z2"}]
}
在服务类中,它被转换为JavaBean输入参数。我已经验证了xsd映射是正确的。 问题是,当我使用JSON作为输入调用服务时,在服务器端javabean中,我只看到第一个值正确填充,但第二个和第三个值始终为空。 换句话说,如果我通过了下面不同组合场景中列出的json,我会看到如上所述的相应结果。
{"a":[{}], "b":[{}], "c":[{}] }
只有 “A” 进行的JavaBean接收。 “b”和“c”被接收为空。{"b":[{}], "c":[{}], "a":[{}] }
在JavaBean中只接收到“b”。 “c”和“a”被接收为空。{"c":[{}], "a":[{}], "b":[{}] }
在JavaBean中只接收到“c”。 “a”和“b”被接收为空。
因此,看起来我只是得到正确的第一个JSON键值对,无论我以什么顺序从客户端传递。
感谢您对此的帮助。
更多细节如下: 这是遗留系统,我没有权利分享的实际代码。系统工作正常,只需输入一个数组,并且需要更新,因此它可以接受JSON中的多个数组,如解释的问题。
以下是系统中完全不同的部分。另外我已经验证了所有的xml名称空间和POJO属性等都是正确的,并且注释得当。
1),它实现PUT方法的CreateABCResource.java:
//package x.y.z
//import javax.ws.rs.*..etc;
@Path("mypath")
public class CreateABCResource{
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@PUT
public AResponse doSomething(CreateABC createABC) {
AResponse x = new AResponse();
//business logic here
return x;
}
}
2)输入POJO CreateABC.java到服务方法PUT是如下:
//package com.x.y
//import ...;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "CreateABC", namespace = "urn:x", propOrder = {
"abc","def","pqr"
})
@XmlRootElement(name = "createAbc", namespace = "urn:x")
public class CreateABC {
@XmlElement(name = "abc", namespace = "urn:x")
protected List<Abc> abc = null;
@XmlElement(name = "def", namespace = "urn:x")
protected List<Def> def = null;
@XmlElement(name = "pqr", namespace = "urn:x")
protected List<Pqr> pqr = null;
@XmlAttribute(required = true)
protected String a;
@XmlAttribute(required = true)
protected String b;
@XmlAttribute(required = true)
protected String c;
//and so on ...
//getter setters...
}
3)输入JSON来自客户端/提琴手测试工具:
{
"a": "some value a",
"b": "some value b",
"c": "some value c",
"abc":[{},{}],
"def":[{},{}],
"pqr":[{},{}]
}
4)包含JAXB映射的xsd:
<xs:element name="createAbc" type="CreateABC" />
<xs:complexType name="CreateABC">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="abc" type="Abc" />
<xs:element minOccurs="0" maxOccurs="unbounded" name="def" type="Def" />
<xs:element minOccurs="0" maxOccurs="unbounded" name="pqr" type="Pqr" />
</xs:sequence>
<!-- THIS IS COMMENTED, BUT THIS ALSO DIDNOT WORK IN PLACE OF ABOVE sequence
<xs:all>
<xs:element minOccurs="0" maxOccurs="unbounded" name="abc" type="Abc" />
<xs:element minOccurs="0" maxOccurs="unbounded" name="def" type="Def" />
<xs:element minOccurs="0" maxOccurs="unbounded" name="pqr" type="Pqr" />
</xs:all>
-->
<xs:attribute name="a" use="required" type="xs:string" />
<xs:attribute name="b" use="required" type="xs:string" />
<xs:attribute name="c" use="required" type="xs:string" />
</xs:complexType>
<xs:complexType name="Abc">
<!-- CORRET DEFINITON OF Abc is present here -->
</xs:complexType>
<xs:complexType name="Def">
<!-- CORRET DEFINITON OF Def is present here -->
</xs:complexType>
<xs:complexType name="Pqr">
<!-- CORRET DEFINITON OF Pqr is present here -->
</xs:complexType>
json不使用xsd,我认为你必须与xml在这里混淆 – gerrytan
你是对的@gerrytan xsd是否存在只是因为该服务也支持xml,我已经在这方面提及它。 – Nitin
您使用什么库和Java类来反序列化Json? – gerrytan