2

私は型クラスを持っています:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="Record")
public class Record
{
    @XmlAttribute(name="status")
    private Status status  ;
}   

および列挙型クラス:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"status","error"})
@XmlEnum
public enum Status 
{
    OK(0, "No error"),
    ERROR(1, "Some error") ;

    @XmlAttribute(name="status", required=true)
    private Integer status ;
    @XmlAttribute(name="error", required=true) 
    private String error ;

    private Status(Integer status, String error)
    {
        this.status=status ;
        this.error=error ;
    }

    @Override
    public String toString()
    {
        return "Status:" + this.status + " Error:" + this.error;
    }
}

私が得ている結果は次のとおりです: Record status="OK" しかし、私はしたい: Record status="OK" error="No error"

どうすればそれを達成できますか?

4

1 に答える 1

3

toString()JAXB はメソッドを使用するのではなく列挙名を取得するため、これは期待どおりには機能しません。しかし、それができたとしても、必要な出力は生成されません。それは以下を生成します:

<record status="Status:0 Error:No error"/>

通常の JAXB を使用する場合、単一のフィールドを複数の XML 属性に自動的に展開する方法はありません。MOXy JAXB 実装ではこれを行うことができますが、この実装を使用しているとは思えません (詳細については、この質問を参照してください)。

最も単純な解決策は、エラー メッセージを含む別の属性を追加することです。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="Record")
public class Record
{
    @XmlAttribute(name="status")
    private Status status  ;

    @XmlAttribute(name="error")
    private String getError(){
        return status.getError();
    }
}

public enum Status 
{
    OK(0, "No error"),
    ERROR(1, "Some error") ;

    private Integer status ;
    private String error ;

    private Status(Integer status, String error)
    {
        this.status=status ;
        this.error=error ;
    }

    public String getError(){
        return this.error;
    }
}

Statusまた、 enumの JAXB アノテーションは実際には必要ありません。必要なのは、XML に出力される値を列挙値とは異なるものにしたい場合だけです (代わりに XMLのOKように表示したい場合など)。ok@XmlEnum および @XmlEnumValue 注釈はこちらを参照してください。

于 2013-08-11T13:38:12.467 に答える