2011-06-22 12 views
5

İçeriği paylaşmak üzere tasarlanmış bir Web Hizmetleri sunucusu yapıyorum. İçeriği ek içeren SOAP yanıtıyla sunmak istiyorum. Şu anda, istekleri işlemek ve yanıtları sunmak için Spring WS kullanıyorum.Spring-WS'deki bir yanıt yüküne nasıl ek eklerim?

hizmetim böyle bir şey benzer:

@Endpoint 
public class Service{ 

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

} 

Ama bunu yapar ve nasıl tepki için bir fincan kahve bir resim eklemek istediğiniz varsayalım?

düzenleme: bir örnek olarak, Spring-WS ile birlikte gönderilen örnekler, istemcinin eki göndermek için nasıl kullanılacağını gösterir, ancak sunucunun nasıl yanıt vereceğini (burada da burada sorduğum şeyi) göstermez.

cevap

13

Spring-WS'deki belgeler özellikle bu konu hakkında çok açık ve aslında bir SOAP eki eklemek oldukça kolay.

  1. Kişisel WSDL doğru Biz

Ekler üzerinde MimeContainer ikamet Saaj SABUN mesajı fabrikayı kullanacağız

  • çıkış iletide mime:multipartRelated belirtir: Birkaç varsayımlar yapacağız SOAP mesajı. Bu kabı almak için, SOAP cevabını el ile oluşturmamız gerekiyor, bunun bir parçası. bunu yaparken şuna benzer:

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

    Tamam, içeriği:

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

    Şimdi bizim resim için bir DataHandler ihtiyaç kontrol mesajı: çek, hm hala dışarı çıkmak için yanıt almak gerekir . Burada zor kısmı, yaptığımız biz biz yanıt biri olarak bu özel mesajı ayarlayabilirsiniz böylece MessageContext getirmek gerektiğidir bizim getCoffee tanımını düzenleyerek:

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

    koymak Hepsini birbirine:

    : iyi ölçmek için

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

    , burada SaajMessageFactory almak için fasulye bağımlılık enjeksiyon var

  • +0

    Yanıtı bir JAXB nesnesi olarak döndürmek mümkün müdür? – ziggy

    +0

    @ziggy: Bu zaten böyle yapıyor, değil mi? –

    +0

    Yukarıdaki yaklaşımla ilgili bir sorun yaşıyorum. Bu bağlantıya bakın http://stackoverflow.com/questions/11430527/spring-ws-web-service-adding-an-attachment-to-the-response-using-saaj-no-adap – ziggy

    İlgili konular