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>
Czy masz przechwytywacz logowania? –
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
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