You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by kwu <kw...@lssinc.com> on 2013/04/16 02:32:18 UTC
Response data equals to null after SAAJInInterceptor handle message
Hi All,
I am writing an SAAJInInteceptor to manipulate the incoming response
message. I want to trim all the empty elements specifically Calendar Objects
because CXF is trying to parse an null object during unmarshalling.
I've added the interceptor to my factoryBean before creating the port
factoryBean.inInterceptors.add(new
SAAJTrimEmptyElementsInInterceptor(cxfRequestData,
excludeFromTrimOperationNames))
factoryBean.create()
and returns the port created by factoryBean
in my interceptor class
public SAAJTrimEmptyElementsInInterceptor(CxfRequestData cxfRequestData,
List<String> excludeOutboundRequests) {
super(Phase.PRE_PROTOCOL)
addAfter(SAAJInInterceptor.class.getName())
this.cxfRequestData = cxfRequestData
excludeFromTrimOperationNames = excludeOutboundRequests
}
@Override
void handleMessage(SoapMessage soapMessage) {
if(shouldTrimMessage(soapMessage)){
if (soapMessage.getContent(SOAPMessage.class) == null) {
getSaajInInterceptor().handleMessage(soapMessage)
}
SOAPMessage msg = soapMessage?.getContent(SOAPMessage.class)
SOAPBody body = msg?.SOAPBody
body?.childElements?.each {
if (it instanceof SOAPElement) {
removeNil(it)
}
}
}
}
where removeNil is a recursive method which trims the xsi:nil child nodes.
I println() the soap body at the beginning the method to make sure it's
created and at the end of method to make ensure the method has worked.
However, after this interceptor, my response data is all null.
Interceptor happens on this line of code.
def response = port.getData(some arguments)
If I remove the interceptor or the content my handleMessage, the response
data comes back just fine. But, with println(), I can see the body message
pass through the handleMessage method. I've tried a lot of things, including
changing the Phase of the interceptor and none has worked.
Why is my soap message/response data disappearing? Please let me know what
else I can provide to clarify my issue. Thanks!!
--
View this message in context: http://cxf.547215.n5.nabble.com/Response-data-equals-to-null-after-SAAJInInterceptor-handle-message-tp5726342.html
Sent from the cxf-user mailing list archive at Nabble.com.
RE: Response data equals to null after SAAJInInterceptor handle
message
Posted by Andrei Shakirin <as...@talend.com>.
Hi,
The code above works without any problems:
public class SAAJCustomInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
public SAAJCustomInterceptor() {
super(Phase.PRE_PROTOCOL);
addAfter(SAAJInInterceptor.class.getName());
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
System.out.println(message.getInterceptorChain());
SOAPMessage soapMessage = message.getContent(SOAPMessage.class);
try {
Node rootNode = soapMessage.getSOAPBody().getFirstChild();
DOMUtils.writeXml(rootNode, System.out);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Perhaps your method removeNil() somehow breaks SOAPMessage.
Would recommend to test without this call.
Btw: for such transformations you can try CXF transformation feature (http://cxf.apache.org/docs/transformationfeature.html) or XSLT feature (http://cxf.apache.org/docs/xslt-feature.html). In this case you don't need your own interceptor at all and it will perform better.
Regards,
Andrei.
> -----Original Message-----
> From: kwu [mailto:kwu@lssinc.com]
> Sent: Dienstag, 16. April 2013 02:32
> To: users@cxf.apache.org
> Subject: Response data equals to null after SAAJInInterceptor handle
> message
>
> Hi All,
>
> I am writing an SAAJInInteceptor to manipulate the incoming response
> message. I want to trim all the empty elements specifically Calendar Objects
> because CXF is trying to parse an null object during unmarshalling.
>
> I've added the interceptor to my factoryBean before creating the port
>
> factoryBean.inInterceptors.add(new
> SAAJTrimEmptyElementsInInterceptor(cxfRequestData,
> excludeFromTrimOperationNames))
> factoryBean.create()
>
> and returns the port created by factoryBean
>
> in my interceptor class
>
> public SAAJTrimEmptyElementsInInterceptor(CxfRequestData
> cxfRequestData, List<String> excludeOutboundRequests) {
> super(Phase.PRE_PROTOCOL)
> addAfter(SAAJInInterceptor.class.getName())
> this.cxfRequestData = cxfRequestData
> excludeFromTrimOperationNames = excludeOutboundRequests
> }
>
> @Override
> void handleMessage(SoapMessage soapMessage) {
> if(shouldTrimMessage(soapMessage)){
> if (soapMessage.getContent(SOAPMessage.class) == null) {
> getSaajInInterceptor().handleMessage(soapMessage)
> }
> SOAPMessage msg = soapMessage?.getContent(SOAPMessage.class)
>
> SOAPBody body = msg?.SOAPBody
>
> body?.childElements?.each {
> if (it instanceof SOAPElement) {
> removeNil(it)
> }
> }
> }
> }
>
> where removeNil is a recursive method which trims the xsi:nil child nodes.
>
> I println() the soap body at the beginning the method to make sure it's
> created and at the end of method to make ensure the method has worked.
> However, after this interceptor, my response data is all null.
>
> Interceptor happens on this line of code.
>
> def response = port.getData(some arguments)
>
> If I remove the interceptor or the content my handleMessage, the response
> data comes back just fine. But, with println(), I can see the body message
> pass through the handleMessage method. I've tried a lot of things, including
> changing the Phase of the interceptor and none has worked.
>
> Why is my soap message/response data disappearing? Please let me know
> what else I can provide to clarify my issue. Thanks!!
>
>
>
>
> --
> View this message in context: http://cxf.547215.n5.nabble.com/Response-
> data-equals-to-null-after-SAAJInInterceptor-handle-message-
> tp5726342.html
> Sent from the cxf-user mailing list archive at Nabble.com.