2011-11-01 28 views
7

Hãy nói rằng chúng tôi có những điều sau Java 1.5 liệt kê:enum Marshalling thuộc tính vào XML sử dụng JAXB và jaxws Chú thích

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

Tôi đang sử dụng Apache CXF và WSDL được tạo ra, như mong đợi, dịch enum nói trên vào một hạn chế :

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

Cho đến nay rất tốt và đó là tính năng mong muốn. Bản thân tôi nhớ phải vật lộn với các cấu trúc như vậy trước Apache CXF (khi tôi sử dụng XFire).

Tuy nhiên, đây không phải là trường hợp ở đây. Tôi muốn tạo ra một kết quả khác. Tôi muốn rằng enum được dịch thành một loại phức tạp và cả hai thuộc tính mã và thông điệp được dịch thành các phần tử XML khi một đối tượng có chứa một thể hiện của liệt kê này là marshalled. Tôi chỉ muốn nó không cư xử như một kẻ thù. Tôi biết tôi có thể đạt được điều đó nếu tôi sử dụng một lớp học đơn giản thay vì một điều kiện. Tuy nhiên, tôi rất muốn giữ nó một enum vì vậy tôi giữ nó loại an toàn trong java-một phần của mã.

Nếu WSDL được tạo có thể vẫn có giới hạn đối với các giá trị có thể, đó sẽ là kịch bản hoàn hảo. Tôi có thể làm mà không có nó, tuy nhiên. Điều chính ở đây sẽ là giữ cho nó một Java 1.5 enum trong khi vẫn marshalling (và tạo ra một WSDL) ReturnCode như là một loại phức tạp với mã và tin nhắn như các yếu tố của nó.

Tôi đã cố gắng gợi ý rằng với chú thích JAXWS đã cho được đặt trong mã nguồn enum. Có bằng cách nào đó có thể thực hiện điều đó chỉ với những chú thích (hoặc một số khác) không? Hoặc tôi sẽ phải viết một trình soạn thảo/unmarshaller tùy chỉnh và WSDL-máy phát điện?

Cảm ơn bạn rất nhiều!

Trân trọng,

Filipe Fedalto

+1

Tôi vừa vô tình vấp phải một câu hỏi tương tự. Tôi đã không tìm thấy nó trong kết quả tìm kiếm của tôi bởi vì các từ ngữ khá khác nhau. Đây không phải chính xác những gì tôi đang tìm kiếm, nhưng chắc chắn nó có thể mang lại mọi thứ ở đó. Dù sao, nó liên quan đến việc sử dụng @XmlJavaTypeAdapter. Bạn có thể tìm thấy nó trong [Custom Value Serialization for Enums] (http://stackoverflow.com/questions/4656992/providing-custom-value-serialization-for-enums-via-jaxb) –

Trả lời

0

Sử dụng enums trong mã máy chủ java của bạn và dịch để loại phức tạp trong giao diện của bạn phục vụ.

Ví dụ:

@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 
} 
Các vấn đề liên quan