Маршалинг атрибутов перечисления в XML с использованием аннотаций JAXB и JAXWS

Допустим, у нас есть следующее перечисление Java 1.5:

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;

@XmlAccessorType(XmlAccessType.FIELD)
public enum ReturnCode {
    OK(0,"Ok"),
    ERROR_VALIDATION(1,"Validation Error"),
    ERROR_TRANSPORT(2, "Transport Error"),
    ERROR_CASE_01(101, "Business situation #01"),
    ERROR_CASE_02(102, "Business situation #02"),
    ERROR_CASE_03(103, "Business situation #03");

    @XmlElement(nillable=false, required=true)
    private Integer code = 0;

    @XmlElement(nillable=false, required=true)
    private String message = null;

    private ReturnCode(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

Я использую Apache CXF, и сгенерированный WSDL, как и ожидалось, преобразует вышеупомянутое перечисление в ограничение:

<xsd:simpleType name="ReturnCode">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="OK"/>
        <xsd:enumeration value="ERROR_VALIDATION"/>
        <xsd:enumeration value="ERROR_TRANSPORT"/>
        <xsd:enumeration value="ERROR_CASE_01"/>
        <xsd:enumeration value="ERROR_CASE_02"/>
        <xsd:enumeration value="ERROR_CASE_03"/>
    </xsd:restriction>
</xsd:simpleType>

Пока все хорошо, и это это желательная особенность. Я сам помню, как боролся с такими структурами до Apache CXF (когда я использовал XFire).

Однако здесь дело обстоит не так. Я хочу добиться другого результата. Я хочу, чтобы перечисление было преобразовано в сложный тип и чтобы код атрибутов и сообщение транслировались в элементы XML, когда маршалируется объект, содержащий экземпляр этого перечисления. Я только хочу, чтобы он не вел себя как перечисление. Я знаю, что смогу добиться этого, если бы использовал простой класс вместо перечисления. Тем не менее, я бы очень хотел сохранить его в виде перечисления, поэтому я сохранил его типобезопасный в java-части кода.

Если бы сгенерированный WSDL все еще мог иметь ограничение на возможные значения, это был бы идеальный сценарий. Однако я мог обойтись без него. Главное здесь - сохранить Java 1.5 enum, все еще маршалируя (и генерируя WSDL) ReturnCode как сложный тип с кодом и сообщением в качестве его элементов.

Я попытался намекнуть на это с помощью данных аннотаций JAXWS, помещенных в исходный код перечисления. Можно ли как-то добиться этого с помощью только этих (или некоторых других) аннотаций? Или мне придется написать собственный маршаллер / демаршаллер и WSDL-генератор?

Большое спасибо!

С уважением,

Филипе Федалто

7
задан Filipe Fedalto 1 November 2011 в 12:40
поделиться