2014-05-14 27 views
5

Otrzymałem następującą odpowiedź od usługi internetowej i używam następującego kodu, aby anulować odpowiedź, ale zwraca następujący błąd.Błąd JMBB zwraca komunikat "URI nie jest bezwzględny"

SEVERE: java.lang.IllegalArgumentException: URI is not absolute 

Response

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org 
        /2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
     <SearchFlightsResponse xmlns="ElsyArres.API"> 
      <SoapMessage> 
       <Username>TEST</Username> 
       <Password>TESTs</Password> 
       <LanguageCode>EN</LanguageCode> 
       <ErrorMessage /> 
       <ErrorCode>0</ErrorCode> 
       <AppVersion>8.0.3</AppVersion> 
       <Request> 
        <Departure>FDH</Departure> 
        <Destination>HAM</Destination> 
        <DepartureDate>2014-08-08</DepartureDate> 
        <ReturnDate /> 
        <NumADT>1</NumADT> 
        <NumINF>0</NumINF> 
        <NumCHD>0</NumCHD> 
        <CurrencyCode>EUR</CurrencyCode> 
        <CarrierList /> 
        <FareClasses /> 
        <Providers /> 
        <WaitForResult>true</WaitForResult> 
        <NearbyDepartures>true</NearbyDepartures> 
        <NearbyDestinations>true</NearbyDestinations> 
        <RROnly>false</RROnly> 
        <MetaSearch>true</MetaSearch> 
       </Request> 
       <Response> 
        <SearchFlightId>140514114543-02-43064-52</SearchFlightId> 
        <Roundtrip>false</Roundtrip> 
        <CurrencyCode>EUR</CurrencyCode> 
        <Flights> 
         <Flight> 
          <Outbound> 
           <CarName>Inter Sky</CarName> 
           <CarCode>3L</CarCode> 
           <DepName>Friedrichshafen</DepName> 
           <DepCode>FDH</DepCode> 
           <DestName>Hamburg</DestName> 
           <DestCode>HAM</DestCode> 
           <Duration>01:45</Duration> 
           <FlightNo>3L370</FlightNo> 
           <DepDateTime>2014-08-08T06:10:00</DepDateTime> 
           <ArrDateTime>2014-08-08T07:55:00</ArrDateTime> 
           <Legs> 
            <Leg> 
             <Sequence>0</Sequence> 
             <FlightNo>3L370</FlightNo> 
             <DepCode>FDH</DepCode> 
             <DepName>Friedrichshafen</DepName> 
             <DestCode>HAM</DestCode> 
             <DestName>Hamburg</DestName> 
             <DepTime>06:10</DepTime> 
             <ArrTime>07:55</ArrTime> 
             <CarCode>3L</CarCode> 
             <CarName>Inter Sky</CarName> 
             <FareClass>Economy</FareClass> 
             <ArrDateTime>2014-08-08T07:55:00</ArrDateTime> 
             <DepDateTime>2014-08-08T06:10:00</DepDateTime> 
            </Leg> 
           </Legs> 
           <Taxes>0</Taxes> 
           <FareADT>6500</FareADT> 
           <FareCHD>0</FareCHD> 
           <FareINF>0</FareINF> 
           <MiscFees>6400</MiscFees> 
           <Idx>307963</Idx> 
           <FareClass>Economy</FareClass> 
           <FareType>Web</FareType> 
           <FareId>3L0</FareId> 
          </Outbound> 
          <BagFee>0</BagFee> 
          <CcFee>600</CcFee> 
          <HandlingFee>500</HandlingFee> 
          <TotalFare>12900</TotalFare> 
          <FlightId>140514114543-02-21212-2</FlightId> 
          <Link2Book>http://sample.com</Link2Book> 
          <Provider>ElsyArres</Provider> 
         </Flight> 
         <Flight> 
          <Outbound> 
           <CarName>Inter Sky</CarName> 
           <CarCode>3L</CarCode> 
           <DepName>Friedrichshafen</DepName> 
           <DepCode>FDH</DepCode> 
           <DestName>Hamburg</DestName> 
           <DestCode>HAM</DestCode> 
           <Duration>01:45</Duration> 
           <FlightNo>3L376</FlightNo> 
           <DepDateTime>2014-08-08T18:00:00</DepDateTime> 
           <ArrDateTime>2014-08-08T19:45:00</ArrDateTime> 
           <Legs> 
            <Leg> 
             <Sequence>0</Sequence> 
             <FlightNo>3L376</FlightNo> 
             <DepCode>FDH</DepCode> 
             <DepName>Friedrichshafen</DepName> 
             <DestCode>HAM</DestCode> 
             <DestName>Hamburg</DestName> 
             <DepTime>18:00</DepTime> 
             <ArrTime>19:45</ArrTime> 
             <CarCode>3L</CarCode> 
             <CarName>Inter Sky</CarName> 
             <FareClass>Economy</FareClass> 
             <ArrDateTime>2014-08-08T19:45:00</ArrDateTime> 
             <DepDateTime>2014-08-08T18:00:00</DepDateTime> 
            </Leg> 
           </Legs> 
           <Taxes>0</Taxes> 
           <FareADT>10500</FareADT> 
           <FareCHD>0</FareCHD> 
           <FareINF>0</FareINF> 
           <MiscFees>6400</MiscFees> 
           <Idx>307964</Idx> 
           <FareClass>Economy</FareClass> 
           <FareType>Web</FareType> 
           <FareId>3L0</FareId> 
          </Outbound> 
          <BagFee>0</BagFee> 
          <CcFee>600</CcFee> 
          <HandlingFee>500</HandlingFee> 
          <TotalFare>16900</TotalFare> 
          <FlightId>140514114543-02-21212-3</FlightId> 
          <Link2Book>http://sample.com</Link2Book> 
          <Provider>ElsyArres</Provider> 
         </Flight> 
        </Flights> 
       </Response> 
      </SoapMessage> 
     </SearchFlightsResponse> 
    </soap:Body> 
</soap:Envelope> 

package-info.java

@XmlSchema( 
    namespace = "http://testv80.elsyarres.net/service.asmx", 
    elementFormDefault = XmlNsForm.QUALIFIED) 
package com.myProject.wegolo 

import javax.xml.bind.annotation.XmlNsForm; 
import javax.xml.bind.annotation.XmlSchema; 

Kod

 ... 
     SOAPMessage sm = response; 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     sm.writeTo(out); 

     this.results = (SearchFlightsResponse) JAXB.unmarshal(sm.toString(), SearchFlightsResponse.class); 

Odpowiedz

1

się następujący wiersz, co jest przyczyną problemu ci:

JAXB.unmarshal(sm.toString(), SearchFlightsResponse.class); 

Wynik sm.toString() będzie coś jak poniżej, a nie String reprezentacji XML.

[email protected]93f23a2 

Co robisz teraz jest odpowiednikiem w następujący sposób:

import javax.xml.bind.JAXB; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXB.unmarshal("com.sun.xml.internal.messaging.saaj.soap.ver1_2.Messa[email protected]", Foo.class); 
    } 
} 

która zwróci następujący wyjątek:

Exception in thread "main" java.lang.IllegalArgumentException: URI is not absolute 
    at java.net.URI.toURL(URI.java:1095) 
    at javax.xml.bind.JAXB.toSource(JAXB.java:291) 
    at javax.xml.bind.JAXB.unmarshal(JAXB.java:205) 
    at forum23652823.Demo.main(Demo.java:8) 

Uwaga

String parametr w JAXB.unmarshal(String, Class) Metoda to lokalizacja XML, a nie sam XML. Właśnie dlatego wyjątek narzeka na URI.

4

Odpowiedź XML, którą otrzymujesz z usługi SOAP, jest niepoprawna. Atrybut xmlns musi być bezwzględnym URI.

Oznacza to nazwa przestrzeni nazw musi być w formie: <scheme>:<scheme-specific-part>

Aby XML było ważne, usługa dzwonisz powinno być odesłanie urn:ElsyArres.API jako wartość przestrzeni nazw.

<SearchFlightsResponse xmlns="urn:ElsyArres.API"> 

Plik pakiet-info będzie wtedy wyglądać następująco:

@XmlSchema( 
    namespace = "urn:ElsyArres.API", 
    elementFormDefault = XmlNsForm.QUALIFIED) 
package com.myProject.wegolo 

import javax.xml.bind.annotation.XmlNsForm; 
import javax.xml.bind.annotation.XmlSchema; 

Jeśli nie można uzyskać usługę, aby rozwiązać ten problem URI można go usunąć podczas unmarshalling dzięki zastosowaniu SAXFilter. Oto świetny przykład, który obsługuje dodawanie i usuwanie przestrzeni nazw podczas definiowania unmarshalling: https://stackoverflow.com/a/2148541/73446

+0

Zmieniłem go ElsyArres.API ale nadal rzuca ten sam błąd. – J888

+0

Mam edytować odpowiedź – gregwhitaker

+0

dzięki za odpowiedź, ale nie mogę poprosić ich, aby zmienić ich usługi, czy istnieje sposób, aby obsłużyć błąd? – J888

0

Podczas wykonywania polecenia unmarshalling parsuję plik xml i podaję jedyny element klasy. Dla Twojego przypadku: podaj następujący ciąg do unmarshaller, dzięki czemu zaoszczędzisz wielu nudnych błędów. Po tym, jeśli pojawi się błąd, możesz spróbować również usunąć xmlns = "ElsyArres.API". Przestrzenie nazw mogą generować również błędy.

<SearchFlightsResponse xmlns="ElsyArres.API"> 
     <SoapMessage> 
      <Username>TEST</Username> 
      <Password>TESTs</Password> 
      <LanguageCode>EN</LanguageCode> 
      <ErrorMessage /> 
      <ErrorCode>0</ErrorCode> 
      <AppVersion>8.0.3</AppVersion> 
      <Request> 
       <Departure>FDH</Departure> 
       <Destination>HAM</Destination> 
       <DepartureDate>2014-08-08</DepartureDate> 
       <ReturnDate /> 
       <NumADT>1</NumADT> 
       <NumINF>0</NumINF> 
       <NumCHD>0</NumCHD> 
       <CurrencyCode>EUR</CurrencyCode> 
       <CarrierList /> 
       <FareClasses /> 
       <Providers /> 
       <WaitForResult>true</WaitForResult> 
       <NearbyDepartures>true</NearbyDepartures> 
       <NearbyDestinations>true</NearbyDestinations> 
       <RROnly>false</RROnly> 
       <MetaSearch>true</MetaSearch> 
      </Request> 
      <Response> 
       <SearchFlightId>140514114543-02-43064-52</SearchFlightId> 
       <Roundtrip>false</Roundtrip> 
       <CurrencyCode>EUR</CurrencyCode> 
       <Flights> 
        <Flight> 
         <Outbound> 
          <CarName>Inter Sky</CarName> 
          <CarCode>3L</CarCode> 
          <DepName>Friedrichshafen</DepName> 
          <DepCode>FDH</DepCode> 
          <DestName>Hamburg</DestName> 
          <DestCode>HAM</DestCode> 
          <Duration>01:45</Duration> 
          <FlightNo>3L370</FlightNo> 
          <DepDateTime>2014-08-08T06:10:00</DepDateTime> 
          <ArrDateTime>2014-08-08T07:55:00</ArrDateTime> 
          <Legs> 
           <Leg> 
            <Sequence>0</Sequence> 
            <FlightNo>3L370</FlightNo> 
            <DepCode>FDH</DepCode> 
            <DepName>Friedrichshafen</DepName> 
            <DestCode>HAM</DestCode> 
            <DestName>Hamburg</DestName> 
            <DepTime>06:10</DepTime> 
            <ArrTime>07:55</ArrTime> 
            <CarCode>3L</CarCode> 
            <CarName>Inter Sky</CarName> 
            <FareClass>Economy</FareClass> 
            <ArrDateTime>2014-08-08T07:55:00</ArrDateTime> 
            <DepDateTime>2014-08-08T06:10:00</DepDateTime> 
           </Leg> 
          </Legs> 
          <Taxes>0</Taxes> 
          <FareADT>6500</FareADT> 
          <FareCHD>0</FareCHD> 
          <FareINF>0</FareINF> 
          <MiscFees>6400</MiscFees> 
          <Idx>307963</Idx> 
          <FareClass>Economy</FareClass> 
          <FareType>Web</FareType> 
          <FareId>3L0</FareId> 
         </Outbound> 
         <BagFee>0</BagFee> 
         <CcFee>600</CcFee> 
         <HandlingFee>500</HandlingFee> 
         <TotalFare>12900</TotalFare> 
         <FlightId>140514114543-02-21212-2</FlightId> 
         <Link2Book>http://sample.com</Link2Book> 
         <Provider>ElsyArres</Provider> 
        </Flight> 
        <Flight> 
         <Outbound> 
          <CarName>Inter Sky</CarName> 
          <CarCode>3L</CarCode> 
          <DepName>Friedrichshafen</DepName> 
          <DepCode>FDH</DepCode> 
          <DestName>Hamburg</DestName> 
          <DestCode>HAM</DestCode> 
          <Duration>01:45</Duration> 
          <FlightNo>3L376</FlightNo> 
          <DepDateTime>2014-08-08T18:00:00</DepDateTime> 
          <ArrDateTime>2014-08-08T19:45:00</ArrDateTime> 
          <Legs> 
           <Leg> 
            <Sequence>0</Sequence> 
            <FlightNo>3L376</FlightNo> 
            <DepCode>FDH</DepCode> 
            <DepName>Friedrichshafen</DepName> 
            <DestCode>HAM</DestCode> 
            <DestName>Hamburg</DestName> 
            <DepTime>18:00</DepTime> 
            <ArrTime>19:45</ArrTime> 
            <CarCode>3L</CarCode> 
            <CarName>Inter Sky</CarName> 
            <FareClass>Economy</FareClass> 
            <ArrDateTime>2014-08-08T19:45:00</ArrDateTime> 
            <DepDateTime>2014-08-08T18:00:00</DepDateTime> 
           </Leg> 
          </Legs> 
          <Taxes>0</Taxes> 
          <FareADT>10500</FareADT> 
          <FareCHD>0</FareCHD> 
          <FareINF>0</FareINF> 
          <MiscFees>6400</MiscFees> 
          <Idx>307964</Idx> 
          <FareClass>Economy</FareClass> 
          <FareType>Web</FareType> 
          <FareId>3L0</FareId> 
         </Outbound> 
         <BagFee>0</BagFee> 
         <CcFee>600</CcFee> 
         <HandlingFee>500</HandlingFee> 
         <TotalFare>16900</TotalFare> 
         <FlightId>140514114543-02-21212-3</FlightId> 
         <Link2Book>http://sample.com</Link2Book> 
         <Provider>ElsyArres</Provider> 
        </Flight> 
       </Flights> 
      </Response> 
     </SoapMessage> 
    </SearchFlightsResponse>