[英]Unmarshall with JaxB in a Web Service (Soap) Netbeans
我真的在Netbeans上與JaxB和JaxWs斗爭。 如果我解組了普通Java Web應用程序上使用的Java類,則得到打印的xml文件的結果。 如果我然后在soap webservice方法中使用相同的解組代碼,並進行web服務測試,則始終返回null值。
如何在NetBeans上的網絡服務方法中解組xml文件?
這是我的webservice方法代碼部分:
@WebMethod(operationName = "getData")
public String getData() {
try {
//List<String> listing = new ArrayList();
StringBuilder str = new StringBuilder();
FlightList flights = new FlightList();
javax.xml.bind.JAXBContext jaxbCtx = javax.xml.bind.JAXBContext.newInstance(flights.getClass().getPackage().getName());
javax.xml.bind.Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
flights = (FlightList) unmarshaller.unmarshal(new java.io.File("flights.xml")); //NOI18N
for (Flight f : flights.getAvailableFlight()) {
str.append(f.getDestinationCity());
}
String myString = str.toString();
return myString;
} catch (javax.xml.bind.JAXBException ex) {
// XXXTODO Handle exception
System.out.println("Error occured" + ex);
}
return null;
}
這是我的模式示例
<xsd:complexType name="Flight">
<xsd:sequence>
<xsd:element name="aircraftVendor" type="xsd:string"></xsd:element>
<xsd:element name="aircraftCode" type="xsd:string"></xsd:element>
<xsd:element name="aircraftType" type="xsd:string"></xsd:element>
<xsd:element name="fare" type="tns:Fare"/>
</xsd:sequence>
<xsd:element name="FlightList">
<xsd:complexType>
<xsd:sequence >
<xsd:element name="availableFlight" type="tns:Flight" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="Fare">
<xsd:attribute name="amount" type="tns:Value" use="required"/>
</xsd:complexType>
此刻的指導,不勝感激。
我建議您返回myString而不是null作為最后一行代碼,而不是在try catch塊內。
有幾件事可能是問題所在:
問題區域1-使用java.io.File
您不確定在部署應用程序時工作目錄將在哪里。 而不是將XML作為文件加載:
flights = (FlightList) unmarshaller.unmarshal(new java.io.File("flights.xml"))
從ClassLoader
加載它。
InputStream xml = FlightList.class.getClassLoader().getResourceAsStream("flights.xml");
FlightList flightList = (FlightList) unmarshaller.unmarshal(xml);
xml.close();
問題區域2- JAXBContext
可能不了解正確的ClassLoader
確保在包名稱上創建JAXBContext
時傳遞ClassLoader
。 您還需要確保該軟件包包含jaxb.index
文件或ObjectFactory
類。
JAXBContext.newInstance(FlightList.class.getPackage().getName(), FlightList.class.getClassLoader());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.