0

この投稿は、私の問題に最も近いものです。ただし、問題がどのように解決されたのか、または実際に何が問題だったのかについての説明はありません。

根本的な問題を排除するために、非常に基本的な構成を試みました。

私の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>
4

1 に答える 1

0

これに対するより良い解決策が見つかりません。これまでのところ、私が思いつくことができる唯一の答えは、package-info.java を使用することです

@javax.xml.bind.annotation.XmlSchema(namespace = test.ws.PersonEndpoint.NAMESPACE_URI, elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package test.request;

私の古いプロジェクトは春と春を使用していませんでした xsd ファイルに targetNamespace 属性が必要です。現時点では名前空間を使用して現在のアプリを簡素化したかったのですが、spring-ws では機能しないようです。

于 2013-10-05T07:09:48.427 に答える