[
https://issues.apache.org/jira/browse/AXIS-1761?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12484960
]
Jeff Lee commented on AXIS-1761:
--------------------------------
In encountered a similar error, and worked around it by calling
org.apache.axis.wsdl.toJava.Emitter.setWrapArrays(true).
> Deserialization of SOAP(document/literal) went wrong because of Introspection
> Problem
> -------------------------------------------------------------------------------------
>
> Key: AXIS-1761
> URL: https://issues.apache.org/jira/browse/AXIS-1761
> Project: Axis
> Issue Type: Bug
> Components: Serialization/Deserialization
> Affects Versions: 1.2RC2
> Environment: Windows XP, JDK 1.4.2_06
> Reporter: Andre Genser
> Priority: Critical
> Attachments: BeanDeserializer.java, eai-wsdl.zip
>
>
> Deserialization of SOAP(document/literal) went wrong because of Introspection
> Problem
> We use a WSDL in mode document/literal/wrapped with complex datastructures
> defined
> by XML schemata. If I send the SOAP request to the SOAP-Server we get a
> correct
> SOAP Response, but the Deserialization goes wrong. I have modified the
> BeanDeserializer
> with a work arround. More detailed information is explained later.
> If the logging is switched on the following stacktrace is thrown:
> 12031 [main] ERROR org.apache.axis.client.Call - Exception:
> org.xml.sax.SAXException: Invalid element in
> de.d2vodafone.eai.legokias.soapgenerated.ResultDetailsObject - Status
> at
> org.apache.axis.encoding.ser.BeanDeserializer.onStartChild(BeanDeserializer.java:223)
> at
> org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1031)
> at
> org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165)
> at
> org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:1140)
> at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:238)
> at org.apache.axis.message.RPCElement.getParams(RPCElement.java:386)
> at org.apache.axis.client.Call.invoke(Call.java:2402)
> at org.apache.axis.client.Call.invoke(Call.java:2301)
> at org.apache.axis.client.Call.invoke(Call.java:1758)
> at
> de.d2vodafone.eai.legokias.soapgenerated.LegoKiasBindingStub.getCustomerBANDetails(LegoKiasBindingStub.java:6
> 86)
> at
> de.d2vodafone.eai.legokias.LegoKiasFacade.getCustomerDetails(LegoKiasFacade.java:86)
> at
> de.d2vodafone.eai.legokias.test.GetCustomerBANTest.main(GetCustomerBANTest.java:35)
>
> The problem is the detection of getter/setter. The java.beans.Introspection
> class is used to fill the map with detailed type
> definition. The name of the PropertyDescription class is used as the key for
> these Map. I detected the following
> getStatus() -> status
> getBAN() -> BAN
> In the WSDL I defined them as Status and BAN. If now the BeanDeserializer
> tries to deserialize the data in the
> method "onStartChild()", it first tries to get detailed property definition.
> Because of the literal-Mode
> the propertyMap is used to get the information. The localName is used as the
> key for the map.
> In this special case the localName is "Status" but the entry in the map is
> registired as "status".
> The first letter is low sensitive. Hence an exception is thrown because with
> "Status" no entry
> in found.
> I implemented a work around, that isn't really good but it works:
> if (typeDesc != null) {
> // Lookup the name appropriately (assuming an unqualified
> // name for SOAP encoding, using the namespace otherwise)
> String fieldName = typeDesc.getFieldNameForElement(elemQName,
> isEncoded);
> propDesc = (BeanPropertyDescriptor)propertyMap.get(fieldName);
> fieldDesc = typeDesc.getFieldByName(fieldName);
> }
> if (propDesc == null) {
> // look for a field by this name.
> propDesc = (BeanPropertyDescriptor) propertyMap.get(localName);
> //
> *************************************************************
> // MY WORKARROUND
> //
> *************************************************************
>
> if(propDesc == null) {
> String k =
> localName.substring(0,1).toLowerCase() +
> localName.substring(1,localName.length());
> propDesc = (BeanPropertyDescriptor) propertyMap.get(k);
>
> }
>
> }
> The follwing class shows the result of the Introspection class
> package de.d2vodafone.eai.legokias.test;
> import java.beans.IntrospectionException;
> import java.beans.Introspector;
> import java.beans.PropertyDescriptor;
> public class IntrospectionTest {
> private int status;
> private String BAN;
>
>
>
> public static void main(String[] args) {
> try {
> PropertyDescriptor[] props =
> Introspector.getBeanInfo(IntrospectionTest.class).getPropertyDescriptors();
> int len = props.length;
>
> for (int i=0; i < len; i++ ) {
> System.out.println(props[i].getName());
> }
> } catch (IntrospectionException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> }
> }
> public String getBAN() {
> return BAN;
> }
> public void setBAN(String ban) {
> BAN = ban;
> }
> public int getStatus() {
> return status;
> }
> public void setStatus(int status) {
> this.status = status;
> }
> }
> RESULT:
> BAN
> status
> I hope the my information helps you to fix the problem. I think my
> workarround costs tomuch time at runtime.
> With kind regards!
> Andre Genser
--
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]