[ 
https://issues.apache.org/jira/browse/AXIS2-3825?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Detelin Yordanov updated AXIS2-3825:
------------------------------------

    Component/s:     (was: kernel)
    Description: 
Hi guys,
 I have the following problem - I have a simple bean with a property that 
starts with an uppercase letter (e.g. ID).

public class Person {
    protected Integer id;
    protected String name;
    
    public Integer getID() {  return id; }
    public void setID(Integer id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

When I generate the schema element for it (using Java2WSDL), it's being 
generated with lowercase - "iD":

<xs:complexType name="Person">
    <xs:sequence>
        <xs:element minOccurs="0" name="iD" nillable="true" type="xs:int"/>
        <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

That's not a problem by itself, the real problem, however, is that this 
property does not get deserialized corectly on the server
side and the service receives a person object with null ID:

REQUEST:
<ns2:inPerson>
               <ns1:iD xmlns:ns1="http://data.test.tempuri.org/xsd";>1</ns1:iD>
               <ns1:name 
xmlns:ns1="http://data.test.tempuri.org/xsd";>Detelin</ns1:name>
</ns2:inPerson>

RESPONSE:
<ns:return xmlns:ax21="http://data.test.tempuri.org/xsd"; 
type="org.tempuri.test.data.Person">
               <ax21:iD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:nil="true" />
               <ax21:name>Detelin</ax21:name>
</ns:return>

Notice that the returned "iD" property has not been initialized.

I debugged the deserialization code on the server side and found out that the 
reason for this seems to be in the
org.apache.axis2.databinding.utils.BeanUtil#deserialize(Class, 
OMElement,ObjectSupplier, String) method.

The following code at line 429 of BeanUtil(revision 657751):

PropertyDescriptor prty = (PropertyDescriptor)properties.remove(partsLocalName);

is not finding the property descriptor since it searches using "iD" property 
name, while the property descriptor name
has been resolved by the java.beans.Introspector to "ID".

Since the property descriptor is not found, the Person instance does not get 
its property written and the service receives null,
and hence the nil element in the response.

Regards,
   Detelin





  was:
Hi guys,
 I have the following problem - I have a simple bean with a property that 
starts with an uppercase letter (e.g. ID).

public class Person {
    protected Integer id;
    protected String name;
    
    public Integer getID() {  return id; }
    public void setID(Integer id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

When I generate the schema element for it (using Java2WSDL), it's being 
generated with lowercase - "iD":

<xs:complexType name="Person">
    <xs:sequence>
        <xs:element minOccurs="0" name="iD" nillable="true" type="xs:int"/>
        <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

That's not a problem by itself, the real problem, however, is that if I send a 
request  using ADB client it contains "iD",
while the response returned - "ID":

REQUEST:
<ns2:inPerson>
               <ns1:iD xmlns:ns1="http://data.test.tempuri.org/xsd";>1</ns1:iD>
               <ns1:name 
xmlns:ns1="http://data.test.tempuri.org/xsd";>Detelin</ns1:name>
</ns2:inPerson>

RESPONSE:
<ns:return xmlns:ax21="http://data.test.tempuri.org/xsd"; 
type="org.tempuri.test.data.Person">
               <ax21:ID xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:nil="true" />
               <ax21:name>Detelin</ax21:name>
</ns:return>

Notice that the returned "ID" property has not even been initialized.
As you might guess, upon receving of the response, ADB client throws 
"Unexpected subelement ID".

The reason for the lowercase schema element is due to the
org.apache.axis2.description.java2wsdl.DefaultSchemaGenerator#getCorrectName(String
 wrongName)  method
and has been present since Axis2 1.3 (or maybe even earlier).

The method's javadoc states: "JAM converts the first letter of a field into 
uppercase, so field "foo" would end up called "Foo".  This method corrects that 
problem."

Fine, but on server side (see 
org.apache.axis2.databinding.utils.BeanUtil#getPullParser(..)) JAM returns the 
property in uppercase - "ID".
The getPullParser(..) method initially skipped properties whose property 
descriptors were not found, so I just did not get this property included in the 
request (see line 140 in BeanUtil at revision 552171 for example).

Now in Axis2 1.4 I can see that at the same place (now line 172) dims has added 
the following:

if (propDesc == null) {
    propDesc = (PropertyDescriptor)propertMap.get(
            (property.getSimpleName()));
}

This has been added in revision 649524 of BeanUtil with message: "Sync with 
Axis2 trunk".

I guess that because of this now the element gets included in the request, 
however with wrong name.

Regards,
   Detelin





    Environment: Axis2 1.4 (revision 657751 from 1_4 branch)  (was: Axis2 1.4)
        Summary: Object's property not being deserialized because of mismatch 
of schema property name and Java property name  (was: Bean property generated 
with lowercase first letter in schema, but returned with uppercase in the 
response)

> Object's property not being deserialized because of mismatch of schema 
> property name and Java property name
> -----------------------------------------------------------------------------------------------------------
>
>                 Key: AXIS2-3825
>                 URL: https://issues.apache.org/jira/browse/AXIS2-3825
>             Project: Axis 2.0 (Axis2)
>          Issue Type: Bug
>          Components: adb
>    Affects Versions: 1.4
>         Environment: Axis2 1.4 (revision 657751 from 1_4 branch)
>            Reporter: Detelin Yordanov
>         Attachments: stacktrace.txt, tcpmon_log.txt, TypeTest.zip
>
>
> Hi guys,
>  I have the following problem - I have a simple bean with a property that 
> starts with an uppercase letter (e.g. ID).
> public class Person {
>     protected Integer id;
>     protected String name;
>     
>     public Integer getID() {  return id; }
>     public void setID(Integer id) { this.id = id; }
>     public String getName() { return name; }
>     public void setName(String name) { this.name = name; }
> }
> When I generate the schema element for it (using Java2WSDL), it's being 
> generated with lowercase - "iD":
> <xs:complexType name="Person">
>     <xs:sequence>
>         <xs:element minOccurs="0" name="iD" nillable="true" type="xs:int"/>
>         <xs:element minOccurs="0" name="name" nillable="true" 
> type="xs:string"/>
>     </xs:sequence>
> </xs:complexType>
> That's not a problem by itself, the real problem, however, is that this 
> property does not get deserialized corectly on the server
> side and the service receives a person object with null ID:
> REQUEST:
> <ns2:inPerson>
>                <ns1:iD xmlns:ns1="http://data.test.tempuri.org/xsd";>1</ns1:iD>
>                <ns1:name 
> xmlns:ns1="http://data.test.tempuri.org/xsd";>Detelin</ns1:name>
> </ns2:inPerson>
> RESPONSE:
> <ns:return xmlns:ax21="http://data.test.tempuri.org/xsd"; 
> type="org.tempuri.test.data.Person">
>                <ax21:iD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
> xsi:nil="true" />
>                <ax21:name>Detelin</ax21:name>
> </ns:return>
> Notice that the returned "iD" property has not been initialized.
> I debugged the deserialization code on the server side and found out that the 
> reason for this seems to be in the
> org.apache.axis2.databinding.utils.BeanUtil#deserialize(Class, 
> OMElement,ObjectSupplier, String) method.
> The following code at line 429 of BeanUtil(revision 657751):
> PropertyDescriptor prty = 
> (PropertyDescriptor)properties.remove(partsLocalName);
> is not finding the property descriptor since it searches using "iD" property 
> name, while the property descriptor name
> has been resolved by the java.beans.Introspector to "ID".
> Since the property descriptor is not found, the Person instance does not get 
> its property written and the service receives null,
> and hence the nil element in the response.
> Regards,
>    Detelin

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


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to