我正在尝试使用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。问题是,在这种情况下如何读取代码和名称等属性值?
答案 0 :(得分:0)
以下是您支持此用例的方法:
<强> 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)中存在关于此用例的错误: