2010-08-23 5 views
1

J'essaie de créer un exemple de client Java pour un service web SOAP que nous avons construit avec ASP.net.Consommer un service Web ASP.net en utilisant JAX-WS, obtenant "Le type spécifié est abstrait"

Le schéma de message de service Web utilise de nombreuses classes abstraites avec des implémentations de celles-ci, par ex. DeviceIdentifier (résumé), avec SerialNumber et ProductNumber (ce sont des exemples hypothétiques pour illustrer la question)

je wsimport pour créer le proxy côté client pour utiliser le service Web à partir de mon code java:

wsimport -extension -s c:\theservice -d c:\theservice -p theservice http://server/theservice?wsdl 

I puis assembler le message comme suit:

GetDeviceReq request = new GetProductReq(); 
DeviceIdentifier id = new SerialNumber(); 
((SerialNumber)id).setUnitIdentifier(id); 
GetDeviceResp response = service.GetDevice(request); 

Le code se compile parfaitement et s'exécute. Cependant, j'obtiens un SOAPFaultException avec le message suivant du service Web ASP.net:

The specified type is abstract: name='DeviceIdentifier', namespace='http://bogus', at <unitIdentifier xmlns='http://bogus'>. 

Je comprends ce que le message d'erreur signifie, mais je suis à court d'idées pour expliquer pourquoi sa passe dans ce cas? Je soupçonne que cela peut avoir quelque chose à voir avec la façon dont l'outil wsimport a généré le code proxy?

Répondre

1

J'ai résolu mon propre problème! J'utilise JDK 6, qui comprend JAX-WS 2.0. Il semble que cette version ne décore pas automatiquement les classes abstraites avec les attributs @XmlSeeAlso. J'ai modifié manuellement le code de proxy pour inclure ces attributs sur les classes abstraites. Pour l'exemple donné ci-dessus:

Le code généré par wsimport ressemble à ceci:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "DeviceIdentifier") 
public abstract class DeviceIdentifier { 
} 

J'ai ensuite ajouté le @XmlSeeAlso:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "DeviceIdentifier") 
@XmlSeeAlso({SerialNumber.class, ProductNumber.class}) 
public abstract class DeviceIdentifier { 
} 

Ceci est similaire à l'attribut XmlInclude en C#/.Net dans System.Xml

Il semble que ce problème a été corrigé dans les versions plus récentes de JAX-WS selon this article.

Questions connexes