2016-02-13 311 views
0

我有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,我会看到如上所述的相应结果。

  1. {"a":[{}], "b":[{}], "c":[{}] }
    只有 “A” 进行的JavaBean接收。 “b”和“c”被接收为空。

  2. {"b":[{}], "c":[{}], "a":[{}] }
    在JavaBean中只接收到“b”。 “c”和“a”被接收为空。

  3. {"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> 
+0

json不使用xsd,我认为你必须与xml在这里混淆 – gerrytan

+0

你是对的@gerrytan xsd是否存在只是因为该服务也支持xml,我已经在这方面提及它。 – Nitin

+0

您使用什么库和Java类来反序列化Json? – gerrytan

回答

1

替换下面的代码输入POJO:

@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; 

有:

protected List<Abc> abc = null; 
protected List<Def> def = null; 
protected List<Pqr> pqr = null; 

和它的作品。