[英]JAXBElement.getValue() is returning null
我的Pojo课程中有一对多的映射。 一家商店有一个分店,一个分店有很多商店这里的商店代码:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Shop")
public class Shop {
@XmlID
private String name;
@XmlIDREF
@XmlElement(name="ShopBranch",type=Branch.class)
private Branch branch;
//Getter Setter
}
以下是分行代码:
@XmlAccessorType(XmlAccessType.FIELD)
public class Branch {
@XmlID
private String name;
private String address;
@XmlIDREF
@XmlElement(nillable=false,required=true)
private List<Shop> shops;
//Getter and Setters
}
我正在发布一个带有一些基本方法的web服务。 我的wsimport正在生成Branch类,如下所示
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "branch", propOrder = {
"branchName",
"address",
"branchShop"
})
public class Branch {
@XmlElement(name = "BranchName")
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@XmlID
@XmlSchemaType(name = "ID")
protected String branchName;
protected String address;
@XmlElementRef(name = "BranchShop", type = JAXBElement.class)
protected List<JAXBElement<Object>> branchShop;
//Getter-Setter
}
我不知道为什么它是List <JAXBElement <Object >>而不是List <JAXBElement <Shop >>。 但无论如何。 我有一个方法,它返回所有分支,并且工作正常。 当我从branch的实例中提取branchShop时,我获得了branchShop列表的正确大小,但是对于list中的所有项,getValue都返回NULL。 以下是简要代码:
PencilCatalog service= new PencilCatalog();
com.pencilhouse.webservices.PencilService port=service.getPencilCatalogPort();
((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, Constant.PENCIL_SERVICE);
List<Branch> branches= port.getAllBranches();
for(Branch b:branches)
{
System.out.println("******************Branch:"+b.getBranchName()+" "+b.getAddress()+"******************");
JAXBElement<Object>o=b.getBranchShop().get(0);
System.out.println(o+"Value"+o.getScope()+" "+o.getValue());
}
O / P
******************分行:KukatPalli Steer 2 Kukatpalli ****************** javax.xml.bind.JAXBElement @ 45d9d7beValueclass com.pencilhouse.webservices.Branch null
生成的WSDL非常大。 我只发布分店和商店的类型。 我正在使用Endpoint发布webservice
生成的XML:
<xs:complexType name="shop">
<xs:sequence>
<xs:element name="name" type="xs:ID" minOccurs="0"/>
<xs:element name="ShopBranch" type="xs:IDREF" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="branch">
<xs:sequence>
<xs:element name="BranchName" type="xs:ID" minOccurs="0"/>
<xs:element name="address" type="xs:string" minOccurs="0"/>
<xs:element name="BranchShop" type="xs:IDREF" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
截获的信息:请求:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:getAllBranches xmlns:ns2="PencilServiceHouse"/>
</S:Body>
</S:Envelope>
响应:
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:getAllBranchesResponse xmlns:ns2="PencilServiceHouse">
<return>
<name>
KukatPalli
</name>
<address>
Steer 2 Kukatpalli
</address>
<shops>
Pencil World <!-- This is Shop Information which is coming as NULL in java, This is Shop's Name field which is declared as id using @XmlId -->
</shops>
<shops>
Pencils Den
</shops>
<shops>
Pencils Bag
</shops>
</return>
<return>
<name>
Salt Lake
</name>
<address>
Sec V Salt Lake
</address>
<shops>
Pencil World
</shops>
<shops>
Pencils Den
</shops>
</return>
<return>
<name>
Noida
</name>
<address>
Noida Sec 43
</address>
<shops>
Pencils Bag
</shops>
</return>
</ns2:getAllBranchesResponse>
</S:Body>
</S:Envelope>
@XmlIDREF
提供了一种指定文档内引用的方法。 需要通过单独的嵌套关系(例如@XmlElement
)重新引用每个对象,以将数据导入XML文档。
我在博客上写了更多关于@XmlIDREF
文章:
我看到你的博客,我在我的xml响应中获取数据,但问题是,当我使用wsimport在客户端生成我的类时,它为@XmlIDRef生成类型Object并且它没有设置这些属性的数据,因为我解释在我的问题。
在您的示例中,您将:classes - > schema - > classes。 由于Java类和XML Schema不是完美匹配,并且JAXB没有在生成的模式中放置任何特定于JAXB的元数据,因此某些信息会丢失。 您可以按如下方式解决此问题:
您可以使用外部绑定文件来键入IDREF属性。
<jaxb:bindings schemaLocation="schema.xsd" node="/xsd:schema">
<jaxb:bindings node="xsd:complexType[@name='branch']//xsd:element[@name='BranchShop']">
<jaxb:property>
<jaxb:baseType name="org.example.Shop"/>
</jaxb:property>
</jaxb:bindings>
</jaxb:bindings>
这不是一个答案,但它是一个很大的评论和使用一些格式,所以我必须发布它作为答案。
不知何故,你的例子不会加起来。
可疑的第一件事是你有两个Branch
类。 这看起来很怪异。 你为什么需要第二个? 或者这些是服务和客户端实现?
接下来,您的Branch
类使用BranchName
和BranchShop
元素,而您的XML使用name
和shop
元素。 这不合适。 好像您的Web服务没有提供您期望的XML。 这可以解释为什么缺少数据,但让我感到困惑的是 - 为什么你会在branchShop
中获得一个元素。 我实际上希望列表是空的,但你似乎有一些东西。
我的建议是弄清楚,为什么你得到的XML与你的模式不匹配,并实现一个独立的解组单元测试来测试截获的XML的解组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.