You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Ramiro Pugh <ra...@gmail.com> on 2014/02/12 20:19:39 UTC

Create a null (empty) response

Hi! I'm having a trouble with a null response with CXF. I'm using CXF with
Camel and DataFormat POJO. When I try to return a null response (so you can
check the null response inside the wrapper) CXF crash at

at
org.apache.cxf.databinding.AbstractWrapperHelper.createWrapperObject(AbstractWrapperHelper.java:107)
at
org.apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor.handleMessage(WrapperClassOutInterceptor.java:100)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)[147:org.apache.cxf.cxf-api:2.6.0.redhat-60024]
at
org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:77)[147:org.apache.cxf.cxf-api:2.6.0.redhat-60024]
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)[147:org.apache.cxf.cxf-api:2.6.0.redhat-60024]
at
org.apache.cxf.phase.PhaseInterceptorChain.resume(PhaseInterceptorChain.java:231)[147:org.apache.cxf.cxf-api:2.6.0.redhat-60024]
at
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:78)
at
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:236)
at
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:214)
at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:194)
at
org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:130)
at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:221)
at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:141)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:713)
at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:197)
at sun.reflect.GeneratedMethodAccessor160.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)[:1.6.0_30]
at java.lang.reflect.Method.invoke(Method.java:597)[:1.6.0_30]


In the debug I see in the
class org.apache.cxf.databinding.AbstractWrapperHelper


public Object createWrapperObject(List<?> lst)
        throws Fault {
        try {
            Object wrapperObject = createWrapperObject(wrapperType);

            for (int x = 0; x < setMethods.length; x++) {
                if (getMethods[x] == null
                    && setMethods[x] == null
                    && fields[x] == null) {
                    //this part is a header or something
                    //that is not part of the wrapper.
                    continue;
                }
               * Object o = lst.get(x);*
                o = getPartObject(x, o);
                if (o instanceof List && getMethods[x] != null) {
                    List<Object> col =
CastUtils.cast((List<?>)getMethods[x].invoke(wrapperObject));
                    if (col == null) {
                        //broken generated java wrappers
                        if (setMethods[x] != null) {
                            setMethods[x].invoke(wrapperObject, o);
                        } else {
                            fields[x].set(wrapperObject, lst.get(x));
                        }
                    } else {
                        List<Object> olst = CastUtils.cast((List<?>)o);
                        col.addAll(olst);
                    }
                } else if (setMethods[x] != null) {
                    setMethods[x].invoke(wrapperObject, o);
                } else if (fields[x] != null) {
                    fields[x].set(wrapperObject, lst.get(x));
                }
            }
            return wrapperObject;
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new Fault(ex.getCause());
        }
    }


The line *Object o = lst.get(x)* gets a NPE, because the wrapper doesn't
have any element inside. So for test only I put a ArrayList with null
element inside. With this solution CXF is able to response a null element
inside the wrapper.
So, this is OK?

Because my solution for now is create an intercetpro and if the message out
is empty so I will create that list and put it inside de wrapper.

-- 
Ramiro Pugh