Changing WSDL = recreate axis java client?

M

matrixhasu

Hi all,
we'd like to recieve your opinion about a strange and unexpected issue
we're facing right now: we have a web service for which we've provided
a jar java client (generated with axis and wsdl2java) to some users.

We had to modify that web service to include two additional response
fields. After web service modification, the java client stops working
reporting

org.xml.sax.SAXException: Invalid element in
com.webmethods.www.__outputJobInfo - DESCRIPTION

where "DESCRIPTION" is the first additional field.

Did you already face this problem? How would I solve it? I thought
clients would be indipendent to web services output values, if that
change only involve additional fields (i.e., not modify existing one).

Is there some other library/way-to-invoke-ws without have to change
(and thus notify everyone using it) the jar client?

Thanks in advance for your help.

Regards,
Sandro
 
I

Ian Wilson

matrixhasu said:
we have a web service for which we've provided
a jar java client (generated with axis and wsdl2java) to some users.

We had to modify that web service to include two additional response
fields. After web service modification, the java client stops working
reporting

org.xml.sax.SAXException: Invalid element in
com.webmethods.www.__outputJobInfo - DESCRIPTION

where "DESCRIPTION" is the first additional field.

Did you already face this problem? How would I solve it?

I include an API version number as part of the namespace. I provide both
old and new services in parallel until all the clients have transitioned.
I thought
clients would be indipendent to web services output values, if that
change only involve additional fields (i.e., not modify existing one).

Some client web-server technologies are much more tolerant of this than
others. Perl's SOAP::Lite for example, but it depends how the client is
coded. In general, if I change the API I expect to have to change the
clients.
 
B

blazer

Hi all,

This is in response to the posting I've seen regarding AXIS and web
services client libaries blowing up when a WSDL document changes.

Basically the error occurs because a mapping does not exist between an
entry in the WSDL document and your client class. Modifying the
client class as follows will prevent this error from being thrown.

Here's what I had to do to fix the issue:

1) Create a class that extends
org.apache.axis.encoding.ser.BeanDeserializer.
a) Create constructors that basically pass the parameters to the
super class.
b) Override the following method as follows:
@Override
public SOAPHandler onStartChild(String arg0, String arg1, String
arg2, Attributes arg3, DeserializationContext arg4) throws
SAXException {
// TODO Auto-generated method stub
try{
return super.onStartChild(arg0, arg1, arg2, arg3, arg4);
}catch (SAXException e){
return null;
}
}
2) Find the object that is being returned from the web service -
(client class).
a) Override the following method as follows:
/**
* Get Custom Deserializer
*/
public static org.apache.axis.encoding.Deserializer
getDeserializer(
java.lang.String mechType,
java.lang.Class _javaType,
javax.xml.namespace.QName _xmlType) {
return new BigYDeserializer(_javaType, _xmlType, typeDesc);

//new org.apache.axis.encoding.ser.BeanDeserializer(
// _javaType, _xmlType, typeDesc);
}
 

nss

Joined
May 1, 2012
Messages
1
Reaction score
0
Hi guys,

I know this is an old thread, but I am stuck with the same problem.
Could someone please elaborate this solution in more detail?

Regards,
NS

Hi all,

This is in response to the posting I've seen regarding AXIS and web
services client libaries blowing up when a WSDL document changes.

Basically the error occurs because a mapping does not exist between an
entry in the WSDL document and your client class. Modifying the
client class as follows will prevent this error from being thrown.

Here's what I had to do to fix the issue:

1) Create a class that extends
org.apache.axis.encoding.ser.BeanDeserializer.
a) Create constructors that basically pass the parameters to the
super class.
b) Override the following method as follows:
@Override
public SOAPHandler onStartChild(String arg0, String arg1, String
arg2, Attributes arg3, DeserializationContext arg4) throws
SAXException {
// TODO Auto-generated method stub
try{
return super.onStartChild(arg0, arg1, arg2, arg3, arg4);
}catch (SAXException e){
return null;
}
}
2) Find the object that is being returned from the web service -
(client class).
a) Override the following method as follows:
/**
* Get Custom Deserializer
*/
public static org.apache.axis.encoding.Deserializer
getDeserializer(
java.lang.String mechType,
java.lang.Class _javaType,
javax.xml.namespace.QName _xmlType) {
return new BigYDeserializer(_javaType, _xmlType, typeDesc);

//new org.apache.axis.encoding.ser.BeanDeserializer(
// _javaType, _xmlType, typeDesc);
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top