You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Gabo Manuel <km...@solegysystems.com> on 2009/09/04 10:27:04 UTC

[CXF2.2.3][JAX-WS][Code-First][RPC/Lit] Handling null response

Hi All,

I developed a basic crud service. It is set to RPC/Lit. Everything works 
fine for valid transactions, i.e. those with non-null results. But when 
I try to retrieve a non-existing record, I end up with the following error:

org.apache.cxf.interceptor.Fault: Cannot write part currency. 
RPC/Literal parts cannot be null. (WS-I BP R2211)
        at 
org.apache.cxf.binding.soap.interceptor.RPCOutInterceptor.handleMessage(RPCOutInterceptor.java:82)
        at 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
        at 
org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:74)
        at 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
        at 
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:104)
        at 
org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:99)
        at 
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:452)
        at 
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:196)
        at 
org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:220)
        at 
org.apache.cxf.transport.servlet.AbstractCXFServlet.doPost(AbstractCXFServlet.java:153)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:807)
        at 
org.apache.cxf.transport.servlet.AbstractCXFServlet.service(AbstractCXFServlet.java:211)
        at 
org.apache.catalina.core.StandardWrapperValve.invokeServletService(StandardWrapperValve.java:771)
        at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:322)
        at 
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509)
        at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:212)
        at 
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509)
        at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:209)
        at 
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509)
        at 
com.iplanet.ias.web.connector.nsapi.NSAPIProcessor.process(NSAPIProcessor.java:161)
        at com.iplanet.ias.web.WebContainer.service(WebContainer.java:580)

I was wondering if there was a way to allow null results, or if a custom 
handler would be necessary?

Thanks

Gabo

Re: [CXF2.2.3][JAX-WS][Code-First][RPC/Lit] Handling null response

Posted by Gabo Manuel <km...@solegysystems.com>.
Just to record for everyone else. Again my thanks to Dan.

The specific "rule" is in the WSI Basic Profile:

http://www.ws-i.org/profiles/basicprofile-1.1.html

Section 4.4.1:
 
R2211  An ENVELOPE described with an rpc-literal binding MUST NOT have the 
xsi:nil attribute with a value of "1" or "true" on the part accessors.

and:

When a wsdl:part element is defined using the type attribute, the 
serialization of that part in a message is equivalent to an implicit (XML 
Schema) qualification of a minOccurs attribute with the value "1", a maxOccurs 
attribute with the value "1" and a nillable attribute with the value "false".

It is necessary to specify the equivalent implicit qualification because the 
wsdl:part element does not allow one to specify the cardinality and 
nillability rules. Specifying the cardinality and the nillability rules 
facilitates interoperability between implementations. The equivalent implicit 
qualification for nillable attribute has a value of "false" because if it is 
specified to be "true" one cannot design a part whereby the client is always 
required to send a value. For applications that want to allow the wsdl:part to 
to be nillable, it is expected that applications will generate a complexType 
wrapper and specify the nillability rules for the contained elements of such a 
wrapper.



Hope that helps!
Dan



Daniel Kulp wrote:
> There pretty much isn't a way to allow nulls for parameters with rpc/lit.  Its 
> completely against spec and the tck actually tests it.   The part accessor 
> elements aren't allows to have xsi:nil="true" on them.  :-(    When I first 
> discovered this, I actually went and tracked down some wsdl folks to ask about 
> it cause I couldn't believe it either (major deficiency IMO), but it's true.  
>
> The only way to "allow" it would be for you to grab the code for the  
> RPCOutInterceptor and "hack it" to remove the above check.   However, that 
> would probably not end up being interopable since it is against spec.   
> Otherwise, you would need to wrapper the return in some object.   The object 
> itself would exist, but it could have a nillable (or minOccurs=0) element in 
> it.
>
>
> Dan
>
>
>
>
>
> On Fri September 4 2009 4:27:04 am Gabo Manuel wrote:
>   
>> Hi All,
>>
>> I developed a basic crud service. It is set to RPC/Lit. Everything works
>> fine for valid transactions, i.e. those with non-null results. But when
>> I try to retrieve a non-existing record, I end up with the following error:
>>
>> org.apache.cxf.interceptor.Fault: Cannot write part currency.
>> RPC/Literal parts cannot be null. (WS-I BP R2211)
>>         at
>> org.apache.cxf.binding.soap.interceptor.RPCOutInterceptor.handleMessage(RPC
>> OutInterceptor.java:82) at
>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChai
>> n.java:236) at
>> org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingC
>> hainInterceptor.java:74) at
>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChai
>> n.java:236) at
>> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationO
>> bserver.java:104) at
>> org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestinati
>> on.java:99) at
>> org.apache.cxf.transport.servlet.ServletController.invokeDestination(Servle
>> tController.java:452) at
>> org.apache.cxf.transport.servlet.ServletController.invoke(ServletController
>> .java:196) at
>> org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServl
>> et.java:220) at
>> org.apache.cxf.transport.servlet.AbstractCXFServlet.doPost(AbstractCXFServl
>> et.java:153) at
>>  javax.servlet.http.HttpServlet.service(HttpServlet.java:807) at
>> org.apache.cxf.transport.servlet.AbstractCXFServlet.service(AbstractCXFServ
>> let.java:211) at
>> org.apache.catalina.core.StandardWrapperValve.invokeServletService(Standard
>> WrapperValve.java:771) at
>> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.j
>> ava:322) at
>> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509)
>>         at
>> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.j
>> ava:212) at
>> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509)
>>         at
>> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:20
>> 9) at
>> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509)
>>         at
>> com.iplanet.ias.web.connector.nsapi.NSAPIProcessor.process(NSAPIProcessor.j
>> ava:161) at com.iplanet.ias.web.WebContainer.service(WebContainer.java:580)
>>
>> I was wondering if there was a way to allow null results, or if a custom
>> handler would be necessary?
>>
>> Thanks
>>
>> Gabo
>>
>>     
>
>   
> ------------------------------------------------------------------------
>
>
> No virus found in this incoming message.
> Checked by AVG - www.avg.com 
> Version: 8.5.409 / Virus Database: 270.13.83/2352 - Release Date: 09/07/09 18:03:00
>
>   

Re: [CXF2.2.3][JAX-WS][Code-First][RPC/Lit] Handling null response

Posted by Daniel Kulp <dk...@apache.org>.
There pretty much isn't a way to allow nulls for parameters with rpc/lit.  Its 
completely against spec and the tck actually tests it.   The part accessor 
elements aren't allows to have xsi:nil="true" on them.  :-(    When I first 
discovered this, I actually went and tracked down some wsdl folks to ask about 
it cause I couldn't believe it either (major deficiency IMO), but it's true.  

The only way to "allow" it would be for you to grab the code for the  
RPCOutInterceptor and "hack it" to remove the above check.   However, that 
would probably not end up being interopable since it is against spec.   
Otherwise, you would need to wrapper the return in some object.   The object 
itself would exist, but it could have a nillable (or minOccurs=0) element in 
it.


Dan





On Fri September 4 2009 4:27:04 am Gabo Manuel wrote:
> Hi All,
> 
> I developed a basic crud service. It is set to RPC/Lit. Everything works
> fine for valid transactions, i.e. those with non-null results. But when
> I try to retrieve a non-existing record, I end up with the following error:
> 
> org.apache.cxf.interceptor.Fault: Cannot write part currency.
> RPC/Literal parts cannot be null. (WS-I BP R2211)
>         at
> org.apache.cxf.binding.soap.interceptor.RPCOutInterceptor.handleMessage(RPC
> OutInterceptor.java:82) at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChai
> n.java:236) at
> org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingC
> hainInterceptor.java:74) at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChai
> n.java:236) at
> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationO
> bserver.java:104) at
> org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestinati
> on.java:99) at
> org.apache.cxf.transport.servlet.ServletController.invokeDestination(Servle
> tController.java:452) at
> org.apache.cxf.transport.servlet.ServletController.invoke(ServletController
> .java:196) at
> org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServl
> et.java:220) at
> org.apache.cxf.transport.servlet.AbstractCXFServlet.doPost(AbstractCXFServl
> et.java:153) at
>  javax.servlet.http.HttpServlet.service(HttpServlet.java:807) at
> org.apache.cxf.transport.servlet.AbstractCXFServlet.service(AbstractCXFServ
> let.java:211) at
> org.apache.catalina.core.StandardWrapperValve.invokeServletService(Standard
> WrapperValve.java:771) at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.j
> ava:322) at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509)
>         at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.j
> ava:212) at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509)
>         at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:20
> 9) at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509)
>         at
> com.iplanet.ias.web.connector.nsapi.NSAPIProcessor.process(NSAPIProcessor.j
> ava:161) at com.iplanet.ias.web.WebContainer.service(WebContainer.java:580)
> 
> I was wondering if there was a way to allow null results, or if a custom
> handler would be necessary?
> 
> Thanks
> 
> Gabo
> 

-- 
Daniel Kulp
dkulp@apache.org
http://www.dankulp.com/blog