0

我一直在为 JaxB 和 netbeans 上的 JaxWs 苦苦挣扎。如果我在一个普通的 java web 应用程序上解组使用 java 类,我会打印出我的 xml 文件的结果。如果我随后在soap webservice 方法中使用相同的解组代码,并进行web 服务测试,则始终返回空值。

如何在 netbeans 上的 web 服务方法中解组 xml 文件?

这是我的网络服务方法代码部分:

   @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>

我将不胜感激任何帮助,此刻指导..

4

2 回答 2

0

我建议您返回 myString 而不是 null 作为最后一行代码,而不是在 try catch 块中。

于 2013-05-26T16:15:09.000 回答
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包名称时传入 a 。您还需要确保包中包含jaxb.index文件或ObjectFactory类。

JAXBContext.newInstance(FlightList.class.getPackage().getName(), FlightList.class.getClassLoader());
于 2013-05-28T13:13:31.653 回答