带有属性的JAX WS,JAXB和Null元素

时间:2013-09-16 17:38:50

标签: attributes jaxb jax-ws null

我正在尝试使用JAXWS和wsimport来使用Web服务。 WSIMPORT工具生成了所有必需的类,我可以毫无问题地调用服务。

但是,我注意到在响应包含具有有效属性值的nil元素的情况下,JAXWS无法解组并抛出NullPointerException。我使用SOAP UI来帮助调试,这是我发现的。响应返回以下XML(摘录):

            <externalIdentifiers>
                 <identifierType code="2" name="Passport" xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
                 <identifierValue/>
                 <issuingCountry xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
              </externalIdentifiers>

在我的Java代码中,当尝试读取上面标识符类型的“name”属性时,它会抛出一个NPE:

      if(id.getIdentifierType() == null)
            {
                System.out.println("NULL");
            }
            System.out.println("Identifier Type: " + id.getIdentifierType().getName());

输出:

NULL
Exception in thread "main" java.lang.NullPointerException

对于看起来像响应中看起来合理的响应,我将identifierType设置为xsi:nil =“true”。根据W3C,这也是完全有效的XML。问题是,在这种情况下如何读取代码和名称等属性值?

1 个答案:

答案 0 :(得分:0)

以下是您支持此用例的方法:

Java模型

<强> ExternalIdentifiers

您可以将identifierType属性更改为JAXBElement<IdentifierType>类型,而不是IdentifierType。为此,您需要使用@XmlElementRef注释属性。

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ExternalIdentifiers {

    @XmlElementRef(name="identifierType")
    private JAXBElement<IdentifierType> identifierType;

    public JAXBElement<IdentifierType> getIdentifierType() {
        return identifierType;
    }

}

<强>的ObjectFactory

在使用@XmlElementDecl注释的班级中,creat方法需要相应的@XmlRegistry注释。

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;

@XmlRegistry
public class ObjectFactory {

    @XmlElementDecl(name="identifierType")
    public JAXBElement<IdentifierType> createIdentifierType(IdentifierType identifierType) {
        return new JAXBElement(new QName("identifierType"), IdentifierType.class, identifierType);
    }

}

演示代码

<强> input.xml中

<?xml version="1.0" encoding="UTF-8"?>
<externalIdentifiers>
    <identifierType code="2" name="Passport" xsi:nil="true"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</externalIdentifiers>

<强>演示

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(ExternalIdentifiers.class, ObjectFactory.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum18834036/input.xml");
        ExternalIdentifiers externalIdentifiers = (ExternalIdentifiers) unmarshaller.unmarshal(xml);

        System.out.println(externalIdentifiers.getIdentifierType().getValue().getName());
    }

}

<强>输出

Passport

注意

目前EclipseLink JAXB (MOXy)中存在关于此用例的错误: