2011-11-01 18 views
7

en aşağıdaki Java 1.5 numaralandırma var diyelim: Ben Apache CXF ve oluşturulan WSDL kullanıyorumMarshalling enum XML kullanarak JAXB içine nitelikleri ve JAXWS Açıklamalar

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; 
    } 
} 

, beklendiği gibi, bir kısıtlama içine yukarıda belirtilen enum çevirir :

<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> 

Şimdiye kadar çok iyi ve bu istenen bir özelliktir. Kendimi Apache CXF'den önce (XFire kullandığımda) bu tür yapılarla mücadele etmeyi hatırlıyorum. Ancak, burada durum böyle değildir. Farklı bir sonuç üretmek istiyorum. Enum'un bir Karmaşık Tür'e dönüştürülmesini ve bu numaralandırmanın bir örneğini içeren bir nesnenin sıralı hale getirilmesi durumunda, kod ve iletinin nitelik ve özelliklerinin XML öğelerine dönüştürülmesini istiyorum. Sadece bir enum gibi davranmamasını istiyorum. Başarımı yerine enum yerine düz bir sınıf kullanırsam başarabileceğimi biliyorum. Bununla birlikte, bunu bir enumda tutmaktan çok hoşlanırdım, bu yüzden kodun java kısmına güvenli bir şekilde sakladım.

Oluşturulan WSDL'nin olası değerler konusunda hala bir kısıtlaması olabilirse, bu mükemmel bir senaryo olacaktır. Ancak onsuz yapabilirim. Buradaki ana şey, bir Java 1.5 enumunu muhafaza etmek iken, kodları ve iletiyi unsurları olarak bir Karmaşık Tür olarak döndürme (ve bir WSDL oluşturma) ReturnCode'u.

Verilen JAXWS Ek Açıklamaları ile enum kaynak koduna yerleştirildiğini ima etmeye çalıştım. Bunu (ya da başka bazı) ek açıklamalarla başarmak bir şekilde mümkün mü? Yoksa özel bir marshaller/unmarshaller ve WSDL-generator yazmalı mıyım?

Çok teşekkür ederim!

En java sunucu kodu Saygılarımızla,

Filipe Fedalto

+1

Sadece yanlışlıkla başka benzer bir soru tökezledi. Arama sonuçlarında bulamadım çünkü sözcükler oldukça farklı. Bu tam olarak aradığım şey değil, ama kesinlikle oradaki şeyleri yarım getirebilir. Her neyse, @XmlJavaTypeAdapter kullanımını içerir. Bunu [Enums for Enums] için Özel Değer Serilerinde bulabilirsiniz (http://stackoverflow.com/questions/4656992/providing-custom-value-serialization-for-enums-via-jaxb) –

cevap

0

Kullanım çeteleler ve hizmetin arayüzde karmaşık tür dönüşmektedir.

Örnek:

@WebMethod 
public ComplexType GetInfo(){ 
    ReturnCode response; 
    response = ReturnCode.OK; 
    ComplexType wsResponse; 
    wsResponse = response.toComplexType() 
    return wsResponse; 
} 

@WebMethod 
public void PutInfo(ComplexType input){ 
    ReturnCode request = ReturnCode.fromComplexType(input); 
    //more code 
}