2010-07-08 14 views
5

Son noktaya gönderilmeden önce Sabun mesajının içeriğini değiştirecek bir web hizmeti için bir önleme yazmayı deniyorum. Bir müşteri, bir öğenin değerinin 1 olduğu bir ileti gönderirse, bu öğeyi 2'ye değiştirmek istiyorum, böylece ileti son noktaya ulaştığında, istemcinin 2 yerine 1. Bu, beni terk eden zor bir görev mi, yoksa olması gerekenden daha fazla zorlandığım kolay bir görev mi?Yaylı Sabun önleyici bir mesajın içeriğini nasıl değiştirebilir?

Bazı Bahar ara önleyicilerden geçtim; Ancak doğrulama ve günlüğe kaydetme engelleyicileri, her geçişte olan iletiyi değiştirmez. Wss4jSecurityInterceptor MessageContext'e bazı özellikler ekler; ama yapamadığım hiçbir şeyden yararlanamıyorum. Bir önleme kabuğum var; ama hiçbir şeyden herhangi bir şey yapan hiçbir şey.

public boolean handleRequest(MessageContext messageContext, Object endpoint) 
     throws Exception { 

    SaajSoapMessage saajSoapMessage = (SaajSoapMessage) messageContext 
      .getRequest(); 
    SOAPMessage soapMessage = saajSoapMessage.getSaajMessage(); 
    SOAPBody soapBody = soapMessage.getSOAPBody(); 

    return true; 
} 

Başka birinin bu özel problemi zaten çözmüş olma şansı olduğunu umuyorum. Herhangi bir içgörü takdir edilecektir. Teşekkürler.

cevap

6

Yükün değiştirilmesi biraz zor. Bu işi yapmak için bulduğum tek yol, javax.xml.transform (javax.xml.transform) veriyi işlemek için kullanabileceğiniz ve getPayloadResult() yöntemlerini kullanmaktır.

Bu rahatsız edici ağır, ama böyle bir şey yapabilirsiniz:

Transformer identityTransform = TransformerFactory.newInstance().newTransformer(); 
DOMResult domResult = new DOMResult(); 
identityTransform.transform(soapBody.getPayloadSource(), domResult); 

Node bodyContent = domResult.getNode(); // modify this 

identityTransform.transform(new DOMSource(bodyContent), soapBody.getPayloadResult()); 

Bunu yapmanın daha iyi bir yol görmek isteriz.

+0

Teşekkürler. Haklısınız - birisinin ümit edebileceği kadar doğru değil. Sorunumu başka bir şekilde çözdüm. Orijinal sorumu doğrudan ele almasa da - şu anki problemimi çözdü. – Dave

1

Talebin daha sonra değiştirilmesinin daha kolay olduğunu anladım. Son noktaya ulaşmadan önce verileri değiştirebildiğim sürece orijinal SOAP mesajını değiştirmem gerekmedi.

Tümüyle çalıştığım uç noktalar, AbstractDom4jPayloadEndpoint'i genişletiyor - bu nedenle bu uç noktaları, son noktama geçmeden önce istek öğesinde değişiklik yapmama izin veren bir proxy'ye sardım. yani:

public class MyProxyEndpoint extends AbstractDom4jPayloadEndpoint 

    @Override 
    protected Element invokeInternal( 
     Element requestElement, 
     Document responseDocument) throws Exception 
    { 
     if(requestElement != null) 
     { 
      // alter request element 
     } 

     return (Element) this.invokeMethod.invoke( 
      this.target, 
      requestElement, 
      responseDocument); 
    } 
1

Ben tüm SOAP gövdesi istekleri içine <authentication/> eleman eklemek için bu yanıtında kodu değiştirilme: WebServiceMessageCallback Belgesi değiştirmemi gerektiren çünkü bu çözüm kullanıldı

@Override 
public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException { 
    logger.trace("Enter handleMessage"); 
    try { 
     SaajSoapMessage request = (SaajSoapMessage) messageContext.getRequest(); 
     addAuthn(request); 
    } catch (Exception e) { 
     logger.error(e.getMessage(),e); 
    } 

    return true; 
} 

protected void addAuthn(SaajSoapMessage request) throws TransformerException { 
    Transformer identityTransform = TransformerFactory.newInstance().newTransformer(); 
    DOMResult domResult = new DOMResult(); 
    identityTransform.transform(request.getPayloadSource(), domResult); 

    Node bodyContent = domResult.getNode(); 
    Document doc = (Document) bodyContent; 
    doc.getFirstChild().appendChild(authNode(doc)); 

    identityTransform.transform(new DOMSource(bodyContent), request.getPayloadResult()); 
} 

protected Node authNode(Document doc) { 
    Element authentication = doc.createElementNS(ns, "authentication"); 
    Element username = doc.createElementNS(ns, "username"); 
    username.setTextContent(authn.getUsername()); 
    Element password = doc.createElementNS(ns, "password"); 
    password.setTextContent(authn.getPassword()); 
    authentication.appendChild(username); 
    authentication.appendChild(password); 
    return authentication; 
} 

ve Sabun gövdesi yapılandırılmış Jaxb2Marshaller tarafından yerleştirilmeden önce SaajSoapMessageFactory etkinleştirilir.

İlgili konular