[ 
https://issues.apache.org/jira/browse/CXF-897?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12518244
 ] 

Daniel Kulp commented on CXF-897:
---------------------------------


This  is a hugely complicated so bear with me while I try and explain what's 
going on....

The reason it works with Aegis on the server:  aegis seems to be ignoring the 
element name.   Thus, the fact that the element name is wrong on the wire (more 
in a sec) doesn't bother it.   JAXB, however, is less forgiving and if the 
element name is wrong, it doesn't read anything.

So, what is is wrong?   Well, it has to do with how the "simple" frontend stuff 
derives/creates part/element names when building up the internal service model. 
   If the "debug" information is compiled into the class files, it uses that 
information to provide a "friendlier" wsdl.     In your case, your 
"HelloWorldImpl" is debug compiled and the argument for the echo method is 
named "text" so the element that is expected is named "text".  That's great!    
 

However, on the client side, the proxy is being built from the interface class, 
not an interface.   One of the mysteries of java is that abstract methods (and 
thus interface methods) do NOT get their parameter names compiled into them 
even with debug info.   Thus, when the service model is built from an 
interface, we have to "default" to "arg0".     Thus, the client is sending 
"arg0", but the server is expecting "text".    That doesn't work very well.

There are a couple of workarounds:

1) Have the client use the WSDL generated from the servers ?wsdl call.   Would 
need to set the wsdl url, the service name, port name, etc... 

2) Compile the server code with all the debug stuff off.   If the impl class 
doesn't have the debug information in it, then it should use/expect the default 
of arg0.

3) Use the interface on the server side as well:
svrBean.setServiceClass(HelloWorld.class);
svrBean.setServiceBean(new HelloWorldImpl());

4) Annotate the stuff and use JAX-WS


FYI: this is one reason why JAX-WS MANDATES all params get the "arg0" treatment 
unless there is a WebParam annotation with a name attribute.   You could 
imagine applications working fine during development (with -g) that suddenly 
break when built for production (no -g, -o) and all the qnames and stuff start 
changing.









> Default JAXB Data Binding does not unmarshal parameters correctly for a POJO 
> service
> ------------------------------------------------------------------------------------
>
>                 Key: CXF-897
>                 URL: https://issues.apache.org/jira/browse/CXF-897
>             Project: CXF
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.1
>            Reporter: William Tam
>         Attachments: HelloWorld.java, HelloWorldImpl.java, SimpleTest.java
>
>
> See the attached test case.  It works as is.  But the test case will fail if 
> the following line is commented out the line from SimpleTest.java
> svrBean.getServiceFactory().setDataBinding(new AegisDatabinding());

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to