この投稿は、私の問題に最も近いものです。ただし、問題がどのように解決されたのか、または実際に何が問題だったのかについての説明はありません。
根本的な問題を排除するために、非常に基本的な構成を試みました。
私のspring-ws-context.xmlはこれです:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:sws="http://www.springframework.org/schema/web-services"
xmlns:oxm="http://www.springframework.org/schema/oxm"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/web-services http://www.springframework.org/schema/web-services/web-services-2.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.2.xsd">
<context:component-scan base-package="test" />
<sws:annotation-driven marshaller="marshaller" unmarshaller="marshaller" />
<sws:dynamic-wsdl id="person" portTypeName="Person"
locationUri="/personService/" targetNamespace="http://myschema/person/definitions">
<sws:xsd location="classpath:person.xsd" />
</sws:dynamic-wsdl>
<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>
<oxm:jaxb2-marshaller id="marshaller">
<oxm:class-to-be-bound name="test.request.GetPersonRequest" />
</oxm:jaxb2-marshaller>
私の GetPersonRequest.java はこれです
@XmlRootElement(name = "GetPersonRequest", namespace = PersonEndpoint.NAMESPACE_URI)
@XmlAccessorType(XmlAccessType.FIELD)
public class GetPersonRequest {
@XmlElement
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
私のエンドポイントはこれです:
@Endpoint
public class PersonEndpoint {
public static final String NAMESPACE_URI = "http://myschema/person/schemas";
@Autowired
PersonService service;
@PayloadRoot(namespace = NAMESPACE_URI, localPart="GetPersonRequest")
public @ResponsePayload GetPersonResponse handleGetPersonRequest(@RequestPayload Element request) {
System.out.println("handleGetPersonRequest()");
// TODO: Go to service.getPerson(request)
return new GetPersonResponse();
}
}
サービス全体が正常に稼働しており、エラーは発生していません。これはこれまでのところ問題ありません (上記の手順に従って):
1) エンドポイントは、soapui およびブラウザに wsdl を表示できます。
2) soap xml はエラーなしで送信できます。
3) ログ ファイルは、xml 本文が送信されたことを示します。
しかし、私の人生では @RequestPayload GetPersonRequest リクエストは空白です! クリサケ用のフィールドが 1 つしかないため、設定することさえできません。
ここで、要求オブジェクトとして JAXB を使用せず、代わりに org.w3c.dom.Element を使用すると、送信したすべてのデータがそこにあることがわかります。
私は何が欠けていますか?完全に単純なものが欠けていると思わずにはいられません。
ちなみに、これはサンプル入力です(少なくともログが示すもの):
<sch1:GetPersonRequest xmlns:sch1="http://myschema/person/schemas">
<sch1:id>1</sch1:id>
</sch1:GetPersonRequest>