복붙노트

[SPRING] Spring-WS의 응답 페이로드에 첨부 파일을 추가하려면 어떻게해야합니까?

SPRING

Spring-WS의 응답 페이로드에 첨부 파일을 추가하려면 어떻게해야합니까?

저는 컨텐츠를 공유하도록 설계된 웹 서비스 서버를 구축하고 있습니다. 첨부 파일이 포함 된 SOAP 응답을 통해 콘텐츠를 제공하고 싶습니다. 지금은 요청을 처리하고 응답을 제공하기 위해 Spring WS를 사용하고 있습니다.

내 서비스는 다음과 유사합니다.

@Endpoint
public class Service{

    @PayloadRoot(namespace = "http://foo.com/coffee", localPart = "order")
    @ResponsePayload
    public Coffee getCoffee(@RequestPayload Order order){
        return new Coffee("Hot Joe");
    }

}

그러나 응답에 커피 한 잔의 사진을 첨부하고 싶다고 가정합니다. 어떻게해야합니까?

편집 : 제쳐두고, Spring-WS와 함께 제공되는 예제는 클라이언트를 사용하여 첨부 파일을 보내는 방법을 보여 주지만 서버가 어떻게 응답해야 하는지를 보여주지 않습니다 (여기서 제가 여기서 요구하고있는 것입니다).

해결법

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

    1.Spring-WS의 문서는이 주제에 특히 가볍고 실제로 SOAP 첨부 파일을 추가하는 것은 꽤 쉽습니다. 나는 몇 가지 가정을 할 것이다.

    Spring-WS의 문서는이 주제에 특히 가볍고 실제로 SOAP 첨부 파일을 추가하는 것은 꽤 쉽습니다. 나는 몇 가지 가정을 할 것이다.

    첨부 파일은 SOAP 메시지의 MimeContainer에 있습니다. 이 컨테이너를 얻으려면 수동으로 SOAP 응답을 구성해야한다. 그렇게하는 것은 다음과 같이 보입니다.

    SaajSoapMessageFactory factory = new SaajSoapMessageFactory(
        javax.xml.soap.MessageFactory.newInstance());
    SaajSoapMessage message = factory.createWebServiceMessage();
    

    이제 그림을 위해 DataHandler가 필요합니다.

    DataHandler handler = new DataHandler(
        new URLDataSource(
            Service.class.getResource("coffee.jpg")));
    
    message.addAttachment("picture", handler);
    

    좋아요, 내용 : check, message : check, hm, 여전히 응답을 보내야합니다. 까다로운 부분은 MessageContext를 가져 와서이 특정 메시지를 우리가 응답 할 수 있도록 설정할 수 있다는 것입니다. getCoffee에 대한 정의를 편집하면됩니다.

    public Coffee getCoffee(@RequestPayload Order order, MessageContext context)
    

    함께 모아서:

    @Endpoint
    public class Service{
    
        private SaajSoapMessageFactory saajMessageFactory; // dependency inject this
    
        @PayloadRoot(namespace = "http://foo.com/coffee", localPart = "order")
        @ResponsePayload
        public Coffee getCoffee(@RequestPayload Order order, MessageContext context){
            DataHandler handler = new DataHandler(
                new URLDataSource(
                    Service.class.getResource("coffee.jpg")));
    
            SaajSoapMessage message = saajMessageFactory.createWebServiceMessage();
            message.addAttachment("picture", handler);
    
            context.setResponse(message);
    
            return new Coffee("Hot Joe");
        }
    
        public void setSaajMessageFactory(SaajMessageFactory saajMessageFactory){
            this.saajMessageFactory = saajMessageFactory;
        }
    
        public SaajMessageFactory getSaajMessageFactory(){
            return saajMessageFactory;
        }
    
    }
    

    좋은 측정을 위해 SaajMessageFactory를 얻는 데 필요한 bean 의존성 주입은 다음과 같습니다.

    <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="Service">
        <property name="saajMessageFactory" ref="saajMessageFactory" />
    </bean>
    
  2. from https://stackoverflow.com/questions/6433762/how-do-i-add-an-attachment-to-a-response-payload-in-spring-ws by cc-by-sa and MIT license