Wiosenna usługa internetowa WS. Dodawanie załącznika do odpowiedzi za pomocą SAAJ - Brak adaptera dla punktu końcowego

Naprawdę staram się uzyskać Spring-WS, aby zwrócić odpowiedź z załącznikami. Udało mi się uruchomić wersję MTOM, ale ma ona pewne wymagania wstępne dotyczące klienta, ponieważ uważam, że klient musi mieć włączoną MTOM (popraw mnie, jeśli nie jest to poprawne).

Próbuję teraz użyć standardowego protokołu SOAP z implementacją załączników za pomocą SAAJ i Spring-WS.

W tym celu zaimplementowałem punkt końcowy, który po prostu dołącza do odpowiedzi obraz z lokalnego systemu plików.

@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;
    }
}

Właściwości Saaj są wstrzykiwane w sposób opisany poniżej:


<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>

Gdy próbuję zadzwonić do powyższej usługi, pojawia się następujący błąd:

<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>
Edytuj 13 lipca

Zauważyłem dzisiaj, że zmieniam podpis metody, aby usunąć parametry MessageContext, jak pokazano poniżej, więc nie otrzymuję tego błędu:

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

Problem polega jednak na tym, że muszę uzyskać dostęp do MessageContext, aby móc dodać załącznik. Czy może moja konfiguracja gdzieś się myli?

questionAnswers(1)

yourAnswerToTheQuestion