Java JAXBElement.getValue()返回null

Java JAXBElement.getValue()返回null,java,web-services,jaxb,wsimport,Java,Web Services,Jaxb,Wsimport,我的Pojo类中有一对多映射。 一家商店有一家分店,一家分店有许多商店 以下是店铺代码: @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name="Shop") public class Shop { @XmlID private String name; @XmlIDREF @XmlElement(name="ShopBranch",type=Branch.class) private Branch branch; //Gette

我的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
}
@xmlacessortype(xmlacesstype.FIELD)
公营部门{
@XmlID
私有字符串名称;
私有字符串地址;
@XmlIDREF
@XmlElement(nillable=false,required=true)
私人名单店;
//二传手
}
我正在发布一个带有一些基本方法的Web服务。我的wsimport正在生成分支类,如下所示

@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
    }
@xmlacessortype(xmlacesstype.FIELD)
@XmlType(name=“branch”,比例器={
“布兰奇纳姆”,
“地址”,
“分店”
})
公营部门{
@XmlElement(name=“BranchName”)
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@XmlID
@XmlSchemaType(name=“ID”)
受保护的字符串分支名称;
受保护的字符串地址;
@xmlementref(name=“BranchShop”,type=JAXBElement.class)
受保护名单分店;
//吸气剂设定器
}
我不知道为什么是列表而不是列表。但无论如何。我有一个返回所有分支的方法,这个方法工作得很好。当我从branchShop的实例中提取branchShop时,我得到了branchShop列表的正确大小,但对于列表中的所有项目,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());
}
PencilCatalog服务=新建PencilCatalog();
com.pencilhouse.webservices.PencilService端口=service.getPencilCatalogPort();
((BindingProvider)port.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_属性,Constant.PENCIL_服务);
List branchs=port.getAllBranchs();
对于(分支机构b:分支机构)
{
System.out.println(“****************分支:“+b.getBranchName()+”+b.getAddress()+””*************”;
JAXBElemento=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空

生成的WSDL相当大。我只发布一种类型的分支和商店。我正在使用Endpoint发布Web服务

生成的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>

截获的资料: 请求:


答复:

<?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>

库卡帕利
库卡帕利2号舵
铅笔世界
铅笔窝
铅笔袋
盐湖城
第五节盐湖
铅笔世界
铅笔窝
诺伊达
诺伊达第43节
铅笔袋

这不是一个答案,但它对于一条评论来说太大了,并且使用了一些格式,所以我不得不将其作为答案发布


不知怎的,你的例子根本不符合逻辑

首先值得怀疑的是,您有两个
分支
类。看起来已经很奇怪了。你为什么需要第二个?或者这些是服务和客户机实现

接下来,您的
Branch
类使用
BranchName
BranchShop
元素,而XML使用
name
shop
元素。这不合适。您的web服务似乎没有提供您期望的XML。这可以解释数据丢失的原因,但让我困惑的是,为什么在
分支商店
中会有一个元素。事实上,我希望列表是空的,但你似乎有一些东西


我的建议是找出您得到的XML与模式不匹配的原因,并实现一个独立的解组单元测试来测试对截获的XML的解组。

@XmlIDREF
提供了一种指定文档内引用的方法。需要通过单独的嵌套关系(例如
@xmlement
)引用每个对象,以便将数据放入XML文档中

我在我的博客上写了更多关于
@XmlIDREF
的内容:


更新
我看到了你的博客,我在xml响应中得到了数据,但问题是 当我使用wsimport在客户端生成类时 正在为@XmlIDRef生成类型对象,但未为这些类型设置数据 正如我在问题中解释的那样

在您的示例中,您将看到:类->模式->类。由于Java类和XML模式不是完美匹配的,而且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>


添加您的模式(仅相关部分)和XML。我不会自己编写任何XML文件。所有内容都是使用wsgen和wsimport自动生成的,wsgen和wsimport最终使用jaxb(我想)对不起,您没有发布任何关于如何创建
端口和
分支的代码,因此无法猜测它为什么为空。另外,发布相关的XML模式部分将有助于澄清为什么您得到的是
JAXBElement
,而不是
Shop
。我已经更新了这篇文章。如果需要更多代码,请告诉我您是否可以截取服务返回的XML?不知道这个XML,就不可能说出发生了什么。我猜XML与您的类不匹配,但是如果没有看到XML,很难说。我只有一个分支类(在我的Web服务器端)。另一个是在客户端使用wsimport生成的。
<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>