在Web服务(肥皂)Netbeans中解密与JaxB

时间:2013-05-26 13:33:28

标签: java web-services soap jaxb jax-ws

我一直在努力与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>

我很感激任何帮助,指导此刻..

2 个答案:

答案 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());