Namelles_One
@Namelles_One
Программист

Как свинтить вместе JAX-WS веб-сервис и @XmlAnyElement?

Разрабатываю SOAP @WebService с использованием Spring и JAX-WS 2.2.10.

Приведу код класса, который описывает часть входного параметра в функцию веб-сервиса:

package com.itu.messaging.regional;

import org.w3c.dom.Element;

import javax.xml.bind.annotation.*;
import java.io.Serializable;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "GenericMessagePrimaryContent", propOrder = {
    "any"
})
public class GenericMessagePrimaryContent implements Serializable {

    @XmlAnyElement
    protected Element any;

    /**
     * Gets the value of the any property.
     * 
     * @return
     *     possible object is
     *     {@link Element }
     *     
     */
    public Element getAny() {
        return any;
    }

    /**
     * Sets the value of the any property.
     * 
     * @param value
     *     allowed object is
     *     {@link Element }
     *     
     */
    public void setAny(Element value) {
        this.any = value;
    }
}


Однако же, когда я деплою свой код (и ожидаю увидеть сгенерированный WSDL) - я получаю следующий exception:
java.lang.ClassCastException: com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$26 cannot be cast to com.sun.xml.bind.v2.model.core.EnumLeafInfo.


И, что наиболее интересно, exception возникает в XmlSchemaGenerator.java, но не в JAX-WS XmlSchemaGenerator, а в Glassfish Metro 2.3.1 XmlSchemaGenerator.java. Как это вообще - загадка века.

Проект состоит из нескольких модулей (maven), однако данный модуль вообще не имеет ссылки на metro в его pom.xml, правда, надо уточнить, что есть другой модуль, который использует metro. Что это вообще такое и как такое может быть?
  • Вопрос задан
  • 613 просмотров
Решения вопроса 1
Namelles_One
@Namelles_One Автор вопроса
Программист
Итого, все оказалось проще, хоть и все равно непонятно.

Перенес все классы, содержащие @XmlAnyElement в другой package и, как следствие, другой XML-namespace, по отношению к классам @XmlRootElement.

И все завелось, wsdl сгенерировалось и работает без проблем. Магия какая-то.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@bobzer
Java EE Developer
Обычно, сервера приложений уже содержат библиотеки для поддержки веб-сервисов. Вероятно, ваше приложение также содержит какие-то из таких библиотек, или зависимых.

Попробуйте развернуть "чистый" сервер приложений, с нуля. Затем разверните ваше приложение, но удалите из него все библиотеки, а лучше вообще оставить только класс веб-сервиса и web.xml. Если в такой конфигурации веб-сервис развернётся, то поштучно добавляйте нужные библиотеки (зависимости maven), пересобирайте и деплойте заново, до тех пор, пока ошибка не повторится. Так поймёте какая именно библиотека конфликтует. Вероятно, её надо будет удалить из зависимостей, либо указать как Provided.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы