2016-12-16 2 views
0

Sie müssen einen Out-gebundenen Interceptor schreiben, um die Antwort zu modifizieren. Ich habe einen Interceptor für eine Out-gebundene Antwort geschrieben. Der Interceptor wird in der SEND-Phase hinzugefügt, da der outStream vor der SEND-Phase nicht geändert werden konnte.Apache CXF Interceptors: Kann den Antwort-Stream in einem Out Interceptor nicht ändern

Ich habe versucht, den vorhandenen Ausgabestrom im org.apache.cxf.message.Message-Objekt mit den neuen Datenbytes zu ändern und auch versucht, einen neuen OutputStream im Message-Objekt hinzuzufügen. Aber keiner von ihnen hat funktioniert.

Bitte lassen Sie mich wissen, wenn jemand mit dem gleichen konfrontiert und wenn es eine Lösung dafür gibt.

Danke.

public class SResponseInterceptor2 extends AbstractPhaseInterceptor<Message> { 

private static final Logger LOGGER = LogManager.getLogger(SResponseInterceptor2.class.getName()); 

public SResponseInterceptor2() { 
    super(Phase.SEND); 
    addBefore(MessageSenderInterceptor.class.getName()); 
    LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>>>"); 
} 

public void handleMessage(Message message) throws Fault { 

    OutputStream outputStream = message.getContent(OutputStream.class); 
    if(outputStream!=null && outputStream instanceof CacheAndWriteOutputStream){ 
     CacheAndWriteOutputStream cachedOutputStream = (CacheAndWriteOutputStream)outputStream; 
     try{ 

      String inputMessage = new String(cachedOutputStream.getBytes()); 
      cachedOutputStream.flush(); 

      byte[] bytes = changeResponse(inputMessage).getBytes(); 

cachedOutputStream.write(bytes); 

    /* Tried adding a new Stream with the updated data too 

     OutputStream modifiedOutputStream = new ByteArrayOutputStream(); 
      CacheAndWriteOutputStream cWStream = new CacheAndWriteOutputStream(modifiedOutputStream); 
      cWStream.write(bytes, 0, bytes.length); 
      message.setContent(OutputStream.class, cWStream); 
*/ 
      message.setContent(OutputStream.class, cachedOutputStream); 
     } catch (IOException ioe) { 
      LOGGER.error("Error while changing the Response ." + ioe.getMessage()); 
      ioe.printStackTrace(); 
     }finally{ 

     } 


     private String changeResponse(String responseMessage) { 
      responseMessage = responseMessage.replaceAll("sResponse",       "sResponse??????"); 
      LOGGER.info("After change message is " + responseMessage); 
       return responseMessage; 
} 

}

+0

Überprüfen Sie diese Antwort http://stackoverflow.com/a/12948702/6371459 ich denke, ist das gleiche wie Sie – pedrofb

+0

Dank so viel. Es hat funktioniert. Ich empfehle Verbesserungen in der Dokumentation von Apache. – vinr

+0

Hallo Pedroft .. Der Vorschlag funktionierte, aber der Output-Stream (LoadingByteArrayOutputStream) innerhalb der CacheOutputStream eingewickelt ist auf 2046 Bytes von Daten beschränkt. Wenn neue Nachricht von message.getInterceptorChain(). DoIntercept (Nachricht); gibt die Nachricht ohne die Daten in Output Stream zurück, wenn sie große Daten verarbeiten muss. Das Größenlimit des OutputStreams wurde geändert, aber es hat nicht geholfen.Alle Vorschläge? Danke – vinr

Antwort

0

stackoverflow.com/a/12948702/6371459

Verwandte Themen