cxf-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Daniel Kulp (JIRA)" <j...@apache.org>
Subject [jira] Commented: (CXF-897) Default JAXB Data Binding does not unmarshal parameters correctly for a POJO service
Date Tue, 07 Aug 2007 20:19:59 GMT

    [ 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.


Mime
View raw message