2011-10-17 16 views
7

mam skonfigurowany mój WebService tak:Wiosna WebService unmarshalling nie działa

ApplicationContext:

<sws:annotation-driven />  
<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping" > 
<property name="interceptors"> 
<list> 
    <bean class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor"/> 
</list> 
</property> 

Uwaga: Interceptor jest ładowany przy starcie, ale doesnt napisać cokolwiek, jeżeli wniosek nadchodzi.

Mam klasę PersonServiceImpl z metodą addPersonRequest(). Wszystko działa, jeśli używam org.dom4j.Element jako parametru metody;

@Endpoint 
public class PersonServiceImpl { 
    @PayloadRoot(namespace = "http://www.example.org/person/schema", localPart = "AddPersonRequest") 
    @ResponsePayload 
     public AddPersonRequest addPersonRequest(@RequestPayload Element element) { 
     System.out.println(element.asXML()); 
     Person response = new Person(); 
     response.setId(2); 
     response.setFirstName("Mad"); 
     response.setLastName("Mike"); 
     return response; 
    } 
} 

Ale jeśli mogę zmienić parametry metody, jak pokazano poniżej (tak auto-marshalling z wiosenno-WS należy stosować) w request.getFirstName() drukuje puste. (JAXB2 znajduje się w ścieżce klas).

Klasa osobowa opatrzona jest adnotacjami @XMLType i @XMLRootElement.

Uwaga: Układanie działa dobrze.

@Endpoint 
public class PersonServiceImpl { 
    @PayloadRoot(namespace = "http://www.example.org/person/schema", localPart = "AddPersonRequest") 
    @ResponsePayload 
     public AddPersonRequest addPersonRequest(@RequestPayload Person request, SoapHeader header) { 
     System.out.println(header.getName()); 
     System.out.println(request.getFirstName()); 
     Person response = new Person(); 
     response.setId(2); 
     response.setFirstName("Mad"); 
     response.setLastName("Mike"); 
     return response; 
    } 
} 

Person.java:

@XmlType 
@XmlRootElement(namespace="http://www.example.org/person/schema", name="Person") 
public class Person implements Serializable { 

    private int id; 
    private String firstName; 
    private String lastName; 

    @XmlElement 
    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    @XmlElement 
    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    @XmlAttribute 
    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
} 

Test-Zapytanie wysłane przez SoapUI (generowane z WSDL):

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sch="http://www.example.org/person/schema"> 
<soapenv:Header/> 
<soapenv:Body> 

    <sch:AddPersonRequest> 

    <sch:Person sch:Id="1"> 

     <sch:FirstName>firstname</sch:FirstName> 

     <sch:LastName>lastname</sch:LastName> 

    </sch:Person> 

    </sch:AddPersonRequest> 

</soapenv:Body> 
</soapenv:Envelope> 
+0

Czy masz przechwytywacz logowania? –

+0

Nie, nie zmusiłem go do działania. Po samouczku wiosennego samouczka zmieniłem definicję fasoli w moim appContext (zmiany wprowadzone w oryginalnym poście). Ale mój poziom rejestrowania w Spring-WS jest ustawiony na TRACE i mówi mi: oswseamjXmlRootElementPayloadMethodProcessor - Unmarshalled żądanie ładowności do [[email protected]], więc wszystko wydaje się działać ... – Lodger

+0

Po trochę gry, mam Uzyskaj nowy wyjątek: javax.xml.bind.UnmarshalException: nieoczekiwany element (uri: "http://www.example.org/person/schema", local: "AddPersonRequest"). Oczekiwanymi elementami są <{http://www.example.org/person/schema} Osoba> Może istnieje obszar nazw lub problem części lokalnych, którego nie widzę ?! – Lodger

Odpowiedz

2

Wspomniałeś, że praca w trybie rozrządowym działa. Nie widzę powodu, dla którego nie miałoby dojść do skutku. Czy przetestowałeś marshall i unmarshall w isloation?

Wystarczy, aby upewnić się, że prośba mydło jest dobre, można dodać zalogowaniu przechwytywania i wydrukować rzeczywisty wniosek, że nadchodzi od klienta dostępu do usługi internetowej, Dodaj ten fragment do pliku kontekstowego

<sws:interceptors> 
    <bean class="org.springframework.ws.soap.server.endpoint.interceptor.SoapEnvelopeLoggingInterceptor"> 
     <property name="logRequest" value="true"></property> 
     <property name="logResponse" value="true"></property> 
    </bean> 
</sws:interceptors> 

Powinieneś wyświetlony komunikat dziennika jak ten, który zawiera całą żądania sOAP, dodaję wniosek wiadomość dziennika z UI saop do

DEBUG [http-8080-2]:endpoint.interceptor.SoapEnvelopeLoggingInterceptor.logMessage - Request: 
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sch="http://hoost:port/context/patient/schemas"> 
     <soapenv:Header/> 
     <soapenv:Body> 
      <sch:addRequest> 
       <sch:patient> 
        <sch:id>?</sch:id> 
        <sch:lastname>Joe</sch:lastname> 
       </sch:patient> 
      </sch:addRequest> 
     </soapenv:Body> 
     </soapenv:Envelope> 

aktualizacja odpowiedź

To może być Twoja prośba mydło nie wiem, choć

Kolejna aktualizacja

Wyjątkiem jest ze względu na sposób zdefiniowany punkt końcowy, w swoim wniosku mydła (sch: AddPersonRequest) wysyłasz addPersonRequest nie Person jako ładunek tak zmienić punkt końcowy, aby odzwierciedlić tym, @RequestPayload powinny być AddPersonRequest nie Person

 @PayloadRoot(namespace = "http://www.example.org/person/schema", localPart = "AddPersonRequest") 
    @ResponsePayload 
     public AddPersonRequest addPersonRequest(@RequestPayload AddPersonRequest request, SoapHeader header) { 
+0

Aktywowałem LoggingInterceptor, loguje dokładnie to żądanie, wysłałem przez soapUI (zaktualizowałem to pytanie zapytanie testowe) – Lodger

+0

Zaktualizowałem odpowiedź –

+0

Proszę przeczytać ostatni komentarz na oryginalne pytanie Otrzymałem wyjątek Unmarshalling-Exception Wydaje się, że unmarshaller próbuje sparsować do Person-Object. Pomyślmy o przestrzeni nazw/lokalnych-rzeczy-rzeczy ?! – Lodger

2

Nie jestem pewien, czy trzeba jeszcze odpowiedzieć, czytanie twój ostatni komentarz. Jestem nieco zdezorientowany twoją prośbą i ładunkiem odpowiedzi. Wydają się być przełączeni. W każdym razie trudno to powiedzieć bez klasy Person.

Zajmowałem się już wcześniej podobnymi problemami, a te zostały rozwiązane przez dodanie JAXBElement <> wokół rzeczywistej klasy. Jak ten urywek:

@PayloadRoot(
    localPart = "PutOrganisationUnitRequest", 
    namespace = DEFAULT_NAMESPACE 
) 
@ResponsePayload public JAXBElement<Response> putOrganisationUnits (
    @RequestPayload JAXBElement<PutOrganisationUnitRequest> organisations, 
    MessageContext messageContext) { 

Jedną rzeczą można sprawdzić jest nazw w swojej klasie JAXB i twojej definicji punktów końcowych.

+0

Nadal potrzebuję odpowiedzi :) O czym się dokładnie mylisz? Adnotacje wydają się mieć rację ?! Zaktualizuję moje pytanie, dodając osobę-klasę. Próbowałem do JAXBElement <> wokół mojej klasy, ale nie odniosłem sukcesu. Przestrzeń nazw w pliku XML jest równa przestrzeni nazw odwzorowanej w klasach języka Java. – Lodger

+0

Byłem zdezorientowany co do odpowiedzi i żądania ładunku.Myślę, że chcesz otrzymać AddPersonRequest i odpowiedzieć z osobą. Jeśli to prawda, możesz chcieć zmienić te w swoim podpisie metody. (Zwłaszcza, że ​​powiedziałeś: "Wygląda na to, że unmarshaller próbuje sparsować do Person-Object" w komentarzu z dnia wczorajszego – evandongen

1

Ta implementacja Wiosna usługa jest zupełne garbag mi. Mózg martwego mózgu może działać lepiej niż te "za".

Jak trudno było postępować zgodnie z zasadami JSON i przywracać drzewo obiektów po oferowanym typie root.

NO-ONE potrzebuje tych przestrzeni nazw. Nigdy nie dzieje się tak, że to samo żądanie ma dwa elementy o tej samej nazwie, ale z różnych przestrzeni nazw. Ale te przestrzenie nazw są niekończącym się bólem.

Po prostu dopasuj elementy XML do pól obiektów. To tylko to, co jest wymagane. Przypisuj przestrzenie nazw z WSDL podczas generowania odpowiedzi, jeśli ktokolwiek będzie ich potrzebował do pobierania końca, ale całkowicie je zignoruje, gdy odrzuca żądanie.

Kiedy patrzę na to wszystko, naprawdę chcę spędzić miesiąc i zrobić strukturę serwisową NORMAL SOAP z serializacją/deserializacją XML, która dba tylko o nazwy elementów i automatyczne tworzenie żądań/obiektów odpowiedzi, o ile dopasowuje się drzewo XML drzewo obiektów.

+0

ok, fajna historia bro. – comicurus

Powiązane problemy