IllegalAnnotationException: два класса имеют одинаковое имя типа XML - PullRequest
36 голосов
/ 23 ноября 2010

Я занимаюсь разработкой веб-сервиса под JBoss 5 и Java 1.6.Что может вызвать это исключение?Ниже приведен мой упрощенный код веб-службы.

@Stateless
@WebService()
public class AccountWS {

@WebMethod()
public CreateAccountResponse createAccount(@WebParam(name = "request") CreateAccountRequest request) {
    return null;
}

А ниже приведен полный след стека.

Ответы [ 4 ]

83 голосов
/ 25 ноября 2010

Я нашел причину своей проблемы.

Эта проблема возникает из-за того, что JAX-WS генерирует класс для каждого метода, а имя класса создается путем объединения methodName + "Response". В моем случае вновь сгенерированный класс JAX-WS будет иметь то же имя, что и мой объект ответа.

Пример:

@Stateless
@WebService()
public class AccountWS {

    @WebMethod()
    public CreateAccountResponse createAccount(@WebParam(name = "request") CreateAccountRequest request) {
        return null;
    }
}

JAX-WS создаст новый класс CreateAccountResponse для веб-метода createAccount, имя которого совпадает с именем объекта ответа.

Решение:

Убедитесь, что имя объекта и метода ответа не совпадают. То же самое относится и к параметру метода.

13 голосов
/ 23 ноября 2010

У вас есть два элемента схемы XML с одинаковым именем (createAccountResponse) и одинаковым пространством имен (http://kona.webservice.sif.unidata.com/), соответствующими типам Java com.unidata.sif.kona.account.message.CreateAccountResponse и com.unidata.sif.webservice.kona.jaxws.CreateAccountResponse. Так как второй «автоматически» генерируется аннотацией WebMethod, будет проще изменить аннотацию XMLType для элемента сообщения.

Чтобы решить эту проблему, вы должны изменить name для одного из них или определить два отдельных пространства имен (одно для элементов сообщения, а другое для компонентов запросов и ответов WS). Я рекомендую последний подход (два отдельных пространства имен).

т.е:

1. Изменение имени элемента сообщения com.unidata.sif.kona.account.message.CreateAccountResponse.

@XMLType(name="CreateAccountResponseMsg", namespace="http://kona.webservice.sif.unidata.com")

2. Изменение пространства имен в элементах сообщения (пакет com.unidata.sif.kona.account.message)

@XMLType(name="CreateAccountResponse", namespace="http://kona.webservice.sif.unidata.com/message")
4 голосов
/ 14 сентября 2012

Другое решение заключается в использовании @WebMethod(operationName="differentFromMethodName"). Это даже изменит имя метода интерфейса на клиенте. JAX-WS по-прежнему генерирует классы для wsgen и wsimport, используя имя метода SEI; но теперь классы элементов сообщения отличаются от классов, сгенерированных внутри JAX_WS.

Я не хотел трогать сгенерированные wsgen классы (классы элементов сообщения).

3 голосов
/ 02 октября 2015

Я получил ту же ошибку, но не смог настроить классы с помощью аннотации @XmlType (из библиотеки). Поэтому другое решение - предоставить com.unidata.sif.kona.account.message/package-info.java со следующим кодом внутри

@javax.xml.bind.annotation.XmlSchema(namespace = "http://kona.webservice.sif.unidata.com/")
package com.sopra.banking.processengine.servicecontract.v1_1.dto;
...