2013-05-26 194 views
0

我一直在JaxB和NetBeans JaxWs上苦苦掙扎。 如果我在普通的java web應用程序中解組使用java類,我得到我打印的xml文件的結果。 如果我然後在soap webservice方法中使用相同的解組代碼,並且執行web服務測試,則總是返回空值。Unmarshall與JaxB在Web服務(肥皂)Netbeans

如何在netbeans的webservice方法中解組xml文件?

這裏是我的web服務方法的代碼部分:

@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

我建議你將myString而不是null作爲你的最後一行代碼而不是你的try catch塊。

+0

它仍然返回null,似乎沒有初始化JAXB try塊都 – Ttola

+0

難道你的服務器日誌打印任何錯誤,然後作爲試未執行你釣到的魚應該 – Ayodeji

0

有一對夫婦的事情,可能是問題:

問題區域#1 - 使用java.io.File

你不能知道在哪裏,當你部署應用程序的工作目錄將是。而不是在加載XML的文件:從ClassLoader

flights = (FlightList) unmarshaller.unmarshal(new java.io.File("flights.xml")) 

加載它。

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()); 
+0

感謝這個,我也做所有你的建議,現在我得到這個異常:com.sun.xml.bind.v2.runtime.JAXBContextImpl不能轉換爲com.sun.xml.internal.bind.api.JAXBRIContext \t在com.sun.xml。 internal.ws.fault.SOAPFaultBuilder。 (SOAPFaultBuilder.java:550) – Ttola

+0

@Ttola - 你在哪個應用程序服務器? –

+0

netfish上的glassfish 3.1.2 7.3 – Ttola