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