Допустим, у нас есть следующее перечисление 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-генератор?
Большое спасибо!
С уважением,
Филипе Федалто