Spring WS Webservice. Hinzufügen eines Anhangs zur Antwort mithilfe von SAAJ - Kein Adapter für den Endpunkt

Ich habe wirklich Mühe, Spring-WS dazu zu bringen, eine Antwort mit Anhängen zurückzusenden. Ich habe es geschafft, eine MTOM-Version zum Laufen zu bringen, aber dies hat einige Voraussetzungen auf dem Client, da ich glaube, dass der Client auch MTOM-fähig sein muss (bitte korrigieren Sie mich, wenn dies nicht korrekt ist).

Ich versuche jetzt, den Standard-SOAP mit Anhangsimplementierung unter Verwendung von SAAJ und Spring-WS zu verwenden.

Zu diesem Zweck habe ich einen Endpunkt implementiert, der nur ein Image aus dem lokalen Dateisystem an die Antwort anfügt.

@Endpoint
public class TestEndPoint {

private SaajSoapMessageFactory saajMessageFactory;

@PayloadRoot(namespace="http://ws.mypackage.com", localPart="downloadMessageRequestSaaj")
    @ResponsePayload
    public JAXBElement<DownloadResponseSaajType> invoke(@RequestPayload DownloadMessageRequestSaaj req, MessageContext context ) throws Exception  {

        DownloadResponseSaajType response = new DownloadResponseSaajType();
        DownloadResponseSaajType.PayLoad payload = new DownloadResponseSaajType.PayLoad();  

        DataHandler handler = new javax.activation.DataHandler(new FileDataSource("c:\\temp\\maven-feather.png"));

            SaajSoapMessage message = saajMessageFactory.createWebServiceMessage();
            message.addAttachment("picture", handler);

            context.setResponse(message);

            payload.setMessagePayLoad(handler);

            return objectFactory.createDownloadMessageResponseSaaj(response);  

    }

    public void setSaajMessageFactory(SaajSoapMessageFactory saajMessageFactory){
        this.saajMessageFactory = saajMessageFactory;
    }

    public SaajSoapMessageFactory getSaajMessageFactory(){
        return saajMessageFactory;
    }
}

Die Saaj-Eigenschaften werden wie folgt in Abhängigkeit injiziert:


<sws:annotation-driven/>

<bean id="soapMessageFactory" class="javax.xml.soap.MessageFactory" factory-method="newInstance" />
<bean id="saajMessageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
        <constructor-arg ref="soapMessageFactory" />
</bean>

<bean id="myService" class="com.mypackage.TestEndPoint">
    <property name="saajMessageFactory" ref="saajMessageFactory" />
</bean>

Wenn ich versuche, den oben genannten Service anzurufen, erhalte ich den folgenden Fehler:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode>SOAP-ENV:Server</faultcode>
         <faultstring xml:lang="en">No adapter for endpoint [public javax.xml.bind.JAXBElement&lt;com.mypackage.ws.DownloadResponseSaajType> com.mypackage.TestEndPoint.invoke(com.mypackage.ws.DownloadMessageRequestSaaj,org.springframework.ws.context.MessageContext) throws java.lang.Exception]: Is your endpoint annotated with @Endpoint, or does it implement a supported interface like MessageHandler or PayloadEndpoint?</faultstring>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Bearbeiten Sie den 13. Juli

Mir ist heute aufgefallen, dass ich die Methodensignatur ändere, um die MessageContext-Parameter wie unten gezeigt zu entfernen. Dann erhalte ich diesen Fehler nicht:

public JAXBElement<DownloadResponseSaajType> invoke(@RequestPayload DownloadMessageRequestSaaj req)

Das Problem ist jedoch, dass ich auf den MessageContext zugreifen muss, um den Anhang hinzufügen zu können. Könnte sein, dass meine Konfiguration irgendwo falsch ist?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage