Hi,

You need set re-readable inputstream before the the getBodyElement


On 2009-10-27, at 下午4:38, Håkon Sagehaug wrote:

Hi

thanks for the pointer, but it did not seem to help fro some reason, the content of the message is always null i seems. This is how it looks in my
code

//Get the stream
InputStream is = arg0.getContent(InputStream.class);
       CachedOutputStream bos = null;
       if (is != null) {

           bos = new CachedOutputStream();
           //Copy it to the cachedoutput stream
           IOUtils.copy(is, bos);
           log.info("Set the new content ");

       }
so add
bos.flush();
       is.close();
     // Set the new content
       arg0.setContent(InputStream.class, bos.getInputStream());
       bos.close();
before getBodyElement (as this method actually will consume the inputstream, if the inputstream isn't re-readable, then you get null afterwords)

Freeman

       //Get the content for the body
       log.info("body info {}", getBodyElement(arg0));

       bos.flush();
       is.close();
     // Set the new content
       arg0.setContent(InputStream.class, bos.getInputStream());
       bos.close();


I'm I doing anything wrong here? Tried to place the point where I extract
the body almost everywhere in my code, but nothing seems to help. If I
remove the getBodyElement call everything works fine.

Håkon


2009/10/27 Freeman Fang <[email protected]>

Hi,

I think the error comes from that the inputstream of message is not
re-readable, so if you want to read the message content yourself, ensure that you already copy the inputstream and save it before hand, something
like

      InputStream is = message.getContent(InputStream.class);
      if (is != null) {
          CachedOutputStream bos = new CachedOutputStream();
          try {
              IOUtils.copy(is, bos);

              bos.flush();
              is.close();

message.setContent(InputStream.class, bos.getInputStream());


              bos.close();
          } catch (IOException e) {
              throw new Fault(e);
          }
      }

You can take a look at LoggingInInterceptor[1] as an example, this
interceptor just print out the message content when receive it and will not affect other process afterwords, it's should be similar as your requirement
[1]
https://svn.apache.org/repos/asf/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/LoggingInInterceptor.java

Freeman


On 2009-10-27, at 上午12:12, Håkon Sagehaug wrote:

hi,

I copied the method and i was able to extract the message, but then I got
a
new exception, this one

ERROR - CxfBcComponent - Error processing exchange InOut[
id: ID:129.177.20.229-12490bff30f-2:27
status: Active
role: provider
interface: {http://www.bccs.uib.no/ EchoService.wsdl}EchoServicePortType service: {http://www.bccs.uib.no/EchoService.wsdl}EchoService<http://www.bccs.uib.no/EchoService.wsdl%7DEchoService >
endpoint: EchoServiceProxy
operation: {http://www.bccs.uib.no/EchoService.wsdl}SayHi<http://www.bccs.uib.no/EchoService.wsdl%7DSayHi >
in: null
]


I guess the message for outgoing for some reason is null, so I looked at
[1]
some more and added this to my code

Document messageDocument = DomUtil.createDocument();

     Element soapEnv = DomUtil.createElement(messageDocument,
         new QName(soapVersion.getEnvelope().getNamespaceURI(),
             soapVersion.getEnvelope().getLocalPart(),
             soapVersion.getPrefix()));
     Element soapBody = DomUtil.createElement(soapEnv, new QName(
         soapVersion.getBody().getNamespaceURI(), soapVersion
             .getBody().getLocalPart(), soapVersion
             .getPrefix()));
     soapEnv.appendChild(soapBody);
     Element body = getBodyElement(arg0);

     soapBody.appendChild(soapBody.getOwnerDocument().importNode(
         body, true));

     arg0.setContent(Source.class, new DOMSource(messageDocument));

But this gives also gives me an error,

INFO - PhaseInterceptorChain - Interceptor has thrown exception,
unwinding now null

Not sure what to do, I've tried changing the Phase I have my Interceptor,
first I had it in Phase.READ, and tried some others but no luck.

Any tips on how to solve it??

cheers, Håkon

2009/10/26 Freeman Fang <[email protected]>

Hi,

You can take a look at JbiInWsdl1Interceptor.getBodyElement() [1] as an
example.
[1]

https://svn.apache.org/repos/asf/servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/interceptors/JbiInWsdl1Interceptor.java

Freeman


On 2009-10-26, at 下午10:09, Håkon Sagehaug wrote:

Hi all,


I know this is not a specific servicemix question, but hopefully someone
can
answer it. I'm having cxf-bc that proxy out a web service, and having a interceptor in he xbean configuration for looking for a pattern in the
soap
message. I can extract the soap header in the soap envelope fine, but I couldn't figure out how to extract the soap body. So does anyone have a
tip
how to easily extracting the soap body inside the cxf interceptor?

cheers, Håkon

--
Håkon Sagehaug, Scientific Programmer
Parallab, Bergen Center for Computational Science (BCCS)
UNIFOB AS (University of Bergen Research Company)



--
Freeman Fang
------------------------
Open Source SOA: http://fusesource.com




--
Håkon Sagehaug, Scientific Programmer
Parallab, Bergen Center for Computational Science (BCCS)
UNIFOB AS (University of Bergen Research Company)



--
Freeman Fang
------------------------
Open Source SOA: http://fusesource.com




--
Håkon Sagehaug, Scientific Programmer
Parallab, Bergen Center for Computational Science (BCCS)
UNIFOB AS (University of Bergen Research Company)


--
Freeman Fang
------------------------
Open Source SOA: http://fusesource.com

Reply via email to