복붙노트

[SPRING] Spring WS 웹 서비스. SAAJ를 사용하여 응답에 첨부 파일 추가 - 엔드 포인트 용 어댑터 없음

SPRING

Spring WS 웹 서비스. SAAJ를 사용하여 응답에 첨부 파일 추가 - 엔드 포인트 용 어댑터 없음

첨부 파일이있는 응답을 반환하기 위해 Spring-WS를 얻으려고 정말 어려움을 겪고 있습니다. 필자는 MTOM 버전을 사용할 수있게 만들었지 만 클라이언트가 MTOM을 사용할 수 있어야한다고 생각하기 때문에 클라이언트에 일부 사전 요구 사항이 있습니다 (올바르지 않으면이 문제를 해결하십시오).

내가 지금하려는 것은 SAAJ와 Spring-WS를 사용하여 표준 SOAP을 첨부물 구현과 함께 사용하는 것이다.

이를 위해 로컬 파일 시스템의 이미지를 응답에 첨부하는 엔드 포인트를 구현했습니다.

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

Saj 속성은 아래와 같이 종속성을 주입합니다.

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

위의 서비스를 호출하려고하면 다음과 같은 오류가 발생합니다.

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

오늘 MessageContext 매개 변수를 제거하기 위해 메서드 시그니처를 변경했다는 것을 알게되었습니다.

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

그러나 문제는 첨부 파일을 추가 할 수 있도록 MessageContext에 액세스해야한다는 것입니다. 어쩌면 내 구성이 어딘가 잘못되었을 수 있습니까?

해결법

  1. ==============================

    1.두 경우 모두 클라이언트가 첨부 파일을 인식해야하므로 mtom을 사용하는 것이 좋습니다 (표준이됨에 따라).

    두 경우 모두 클라이언트가 첨부 파일을 인식해야하므로 mtom을 사용하는 것이 좋습니다 (표준이됨에 따라).

    어떤 버전의 spring-ws와 어떤 maven group-id를 사용하고 있는지 확인하십시오. 이 기능이 최근에 추가 되었기 때문에 동일한 오류가 발생했습니다 (제 생각에는?).

    이 항목을 시도하고 다른 봄 - ws 가져 오기를 제거하여 만들기

        <dependency>
            <groupId>org.springframework.ws</groupId>
            <artifactId>spring-ws-core</artifactId>
            <version>2.0.2.RELEASE</version>
        </dependency>
    
  2. from https://stackoverflow.com/questions/11430527/spring-ws-web-service-adding-an-attachment-to-the-response-using-saaj-no-adap by cc-by-sa and MIT license