Использование веб-службы ASP.net с использованием JAX-WS, получение «указанный тип является абстрактным» - PullRequest
1 голос
/ 23 августа 2010

Я пытаюсь создать быстрый пример Java-клиента для веб-службы SOAP, которую мы создали с помощью ASP.net.

Схема сообщения веб-службы использует множество абстрактных классов с их реализацией, например, DeviceIdentifier (аннотация), с SerialNumber и ProductNumber (это гипотетические примеры для иллюстрации вопроса)

Я использовал wsimport для создания прокси на стороне клиента, чтобы использовать веб-сервис из моего кода Java:

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

Затем я собираю сообщение следующим образом:

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

Код отлично компилируется и выполняется. Тем не менее, я получаю SOAPFaultException со следующим сообщением от веб-службы ASP.net:

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

Я понимаю, что означает сообщение об ошибке, но у меня заканчиваются идеи относительно того, почему это происходит в этом случае? Я подозреваю, что это может быть связано с тем, как инструмент wsimport генерировал прокси-код?

1 Ответ

1 голос
/ 23 августа 2010

Я решил свою проблему!

Я использую JDK 6, который включает JAX-WS 2.0.Похоже, что эта версия автоматически не украшает абстрактные классы с атрибутами @XmlSeeAlso.Я вручную изменил код прокси, чтобы включить эти атрибуты в абстрактные классы.Для приведенного выше примера:

Код, сгенерированный wsimport, выглядит следующим образом:

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

Затем я добавил @XmlSeeAlso:

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

Это похоже наатрибут XmlInclude в C # /. Net в System.Xml

Похоже, эта проблема была исправлена ​​в более поздних версиях JAX-WS согласно этой статье .

...