2012-02-15 13 views
2

2つのカスタムタイプをマーシャリング/アンマーシャルしたい。タイプ1にはリストがあります。マーシャリングは期待通りに機能します。リストのtype2要素ごとに別々の要素がありますが、非マーシャル化しようとすると機能しません。リストを非整列化する<foo> JAXB/Jersey

ワークフロー

@XmlRootElement 
public class Workflow { 

    private String userEmail; 
    private List<WorkflowStep> steps = new ArrayList<WorkflowStep>(5); 

    //required by jaxb 
    public Workflow() { 

    } 

    public void setSteps(List<WorkflowStep> steps) { 
     this.steps = steps; 
    } 

    public List<WorkflowStep> getSteps() { 
     //do a defensive copy 
     return new ArrayList<WorkflowStep>(steps); 
    } 

    public void setUserEmail(String email) { 
     userEmail = email; 
    } 

    public String getUserEmail() { 
     return userEmail; 
    } 

} 

WorkflowStep

@XmlRootElement 
public class WorkflowStep { 

    private int cpu = 1; 
    private int mem = 1000; 
    private Map<String, String> parameters = Collections.emptyMap(); 


    public WorkflowStep() { 

    } 

    public void setCpu(int numCores) { 
     cpu = numCores; 
    } 

    public int getCpu() { 
     return cpu; 
    } 

    public void setMem(int mb) { 
     mem = mb; 
    } 

    public int getMem() { 
     return mem; 
    } 

} 

私は、ブラウザからWebサービスにアクセスする場合はここでの出力例です:

<workflow> 
    <steps> 
     <cpu>1</cpu> 
     <inputId>237</inputId> 
     <mem>1000</mem> 
     <parameters/> 
     <status>NOT-YET-STARTED</status> 
     <stepId>1509</stepId> 
     <submoduleId>0</submoduleId> 
     <workflowId>797</workflowId> 
    </steps> 
    <steps> 
     <cpu>1</cpu> 
     <inputId>364</inputId> 
     <mem>1000</mem> 
     <parameters/> 
     <status>NOT-YET-STARTED</status> 
     <stepId>1510</stepId> 
     <submoduleId>3</submoduleId> 
     <workflowId>797</workflowId> 
    </steps> 

    <userEmail>[email protected]</userEmail> 
    <workflowId>797</workflowId> 
    <workflowName>test-name</workflowName> 
</workflow> 

WorkflowStepがされ整列化/整列化は正常に行われましたが、リストは非整列化できませんなぜですか?アプリケーションサーバーもRESTクライアントもエラーまたは例外を受け取ることはなく、クライアントはWorkflowStepsのリストを無視しますか?上の例の出力からは、すべての要素がWorkflowStep型のオブジェクトに変換され、自動的にListに追加されると思いますか?

答えて

6

問題は、このメソッドを使用することです:

public List<WorkflowStep> getSteps() { 
    //do a defensive copy 
    return new ArrayList<WorkflowStep>(steps); 
} 

あなたのJAXB実装チェックがすでにこのメソッドのListあり、かつ存在する場合、それはそれを使用している場合。戻り値のListはアンマーシャルしているオブジェクトによって保持されていないため、アンマーシャリング操作の後でListが失われます。

オプション#1 - あなたのJAXBは、フィールドアクセスを使用するように指定これを変更することができます使用フィールドアクセス

- getSteps()方法

public List<WorkflowStep> getSteps() { 
    //don't do a defensive copy 
    return steps; 
} 

オプション#2を変更します。詳細については

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Workflow { 
    ... 
} 

+0

それをどのように行うには? – LordDoskias

+0

@LordDoskias - フィールドアクセスを指定するための追加情報を追加しました。 –

+1

リフレッシュ後に見ました。いいぞ! – LordDoskias

関連する問題