I've found the solution. After some debugging, I found out that the messages that i was testing with were not of the correct syntax. e.g. the padding of the base64 encoded message was wrong. *yawn*
The method below works like a charm :-) 2012/2/17 anoppe <[email protected]>: > We have a legacy webservice that encodes its entire message with > Base64. I've written an interceptor that decodes the message to its > original form and that works. the interceptor is configured at the > phase RECEIVE. > > Now there is an interceptor, configured at Phase.USER_PROTOCOL, that > checks for a SOAPheader in the message, which worked, but if I enable > the 'decodinginterceptor' the SAAJ model is not created and the > soapheader and body are null. > > I searched the internet and found this > (http://bytearray.brixtonjunkies.com/2009/11/03/cxf-raw-soap-envelope-via-interceptor/) > blog, which explanes exactly my problem. So I implemented his > solution, but with no success. > > InputStream inputStream = message.getContent(InputStream.class); > > if (inputStream != null){ > String processedSoapEnv = ""; > // Cache InputStream so it can be read independently > CachedOutputStream cachedInputStream = new CachedOutputStream(); > try { > IOUtils.copy(inputStream,cachedInputStream); > inputStream.close(); > cachedInputStream.close(); > > InputStream tmpInputStream = cachedInputStream.getInputStream(); > try{ > String inputBuffer = ""; > int data; > while((data = tmpInputStream.read()) != -1){ > byte x = (byte)data; > inputBuffer += (char)x; > } > processedSoapEnv = new String(new > Base64().decode(inputBuffer)); > > > } > catch(IOException e){ > e.printStackTrace(); > } > } > catch (IOException e) { > // TODO Auto-generated catch block > e.printStackTrace(); > } > message.setContent(InputStream.class, new > ByteArrayInputStream(processedSoapEnv.getBytes())); > > If I print the var inputBuffer, I see a Base64 string, if I print the > processedSoapEnv the xml soap message is printed. > > The interceptor is configured before the logging interceptor, and the > message is logged as plain text, like we want. > > What am i doing wrong? > > ps. spring configuration snippet: > <jaxws:endpoint > id="sentinelServer" > implementor="#sentinelServerService" > address="/SentinelServer" > > <jaxws:inInterceptors> > <ref bean="messageDecoder"/> > <bean > class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" /> > <ref bean="securityTokenValidator"/> > <ref bean="requestInterceptor"/> > </jaxws:inInterceptors> > <jaxws:outInterceptors> > <bean > class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor" /> > <ref bean="messageEncoder"/> > <ref bean="responseInterceptor"/> > </jaxws:outInterceptors> > <jaxws:features> > <bean class="org.apache.cxf.feature.LoggingFeature" /> > </jaxws:features> > </jaxws:endpoint> > > -- > View this message in context: > http://cxf.547215.n5.nabble.com/CXF-Saaj-model-SOAPMessage-is-null-after-inpustream-modification-tp5492249p5492249.html > Sent from the cxf-user mailing list archive at Nabble.com.
