2 回答
TA贡献1797条经验 获得超4个赞
好吧,最后我们找到了解决方案。我在下面粘贴我的解决方案。我确实根据@Iurii 更改了代码,但问题出在其他地方。
所以,这是编组部分的变化。QName 的第二个参数必须是类名而不是它的对象。我试图按照这个链接https://codenotfound.com/jaxb-marshal-element-missing-xmlrootelement-annotation.html但没有用。当将 QName 的第二个参数更改为类名时,它就起作用了。并且上下文应该由该类构成,因为 ObjectFactory 没有它。
JAXBContext jaxbContext = JAXBContext.newInstance(IBUSStatusType.class);
QName qName = new QName("http://soa.independenthealth.com/ibus/v1.1.0", "IBUSStatusType");
JAXBElement<IBUSStatusType> root = new JAXBElement<IBUSStatusType>(qName, IBUSStatusType.class, iBUSStatusType);
这是整个 Unmarshal 代码。我们必须在解组之前将 xml 更改为节点。Element的导入是import org.w3c.dom.Element;
public static IBUSStatusType getIBUSStatusType(String xml)
throws JAXBException, SAXException, IOException, ParserConfigurationException
{
JAXBContext jaxbContext = JAXBContext
.newInstance(IBUSStatusType.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Element node = DocumentBuilderFactory
.newInstance()
.newDocumentBuilder()
.parse(new ByteArrayInputStream(xml.getBytes()))
.getDocumentElement();
return ((JAXBElement<IBUSStatusType>) jaxbUnmarshaller.unmarshal(node, IBUSStatusType.class)).getValue();
}
TA贡献1780条经验 获得超4个赞
看看你的架构
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://soa.myhealth.com/ibus/v1.1.0" targetNamespace="http://soa.myhealth.com/ibus/v1.1.0" elementFormDefault="qualified">
<xsd:element name="IBUSMessage" type="tns:IBUSMessage"/>
<xsd:complexType name="IBUSMessage">
<xsd:sequence>
<xsd:element name="Header" type="tns:IBUSHeaderType"/>
<xsd:element name="Detail" type="tns:IBUSVariantType"/>
<xsd:element name="Status" type="tns:IBUSStatusType"/>
</xsd:sequence>
</xsd:complexType>
有一个命名空间http://soa.myhealth.com/ibus/v1.1.0 ,当您进行解组时,它期望http://soa.myhealth.com/ibus/v1.1.0 但以前当您进行编组时,您放置以下命名空间
QName qName = new QName("com.myhealth.soa.ibus.v1_1", "iBUSStatusType");
它们不一样。
添加回答
举报