我一直在努力与JaxB和netbeans上的JaxWs斗争。 如果我在普通的Java Web应用程序上解组使用java类,我会得到打印的xml文件的结果。 如果我在soap webservice方法中使用相同的解组代码,并且执行Web服务测试,则始终返回null值。
如何在netbeans上的webservice方法中解组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>
我很感激任何帮助,指导此刻..
答案 0 :(得分:0)
我建议你将myString而不是null作为最后一行代码而不是try catch块。
答案 1 :(得分:0)
有几件事可能是问题:
问题区域#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
确保在包名称上创建ClassLoader
时传入JAXBContext
。您还需要确保该包包含jaxb.index
文件或ObjectFactory
类。
JAXBContext.newInstance(FlightList.class.getPackage().getName(), FlightList.class.getClassLoader());