2012-02-15 3 views
2

Je veux marshaler/unmarshal 2 types personnalisés. Et le type 1 a une liste. La marchage fonctionne comme prévu - Je vois un élément séparé pour chaque élément de type2 dans la liste, mais quand j'essaye de le démasaliser, cela ne fonctionne pas.Unmarshalling List <foo> avec JAXB/Jersey

Flux de travail

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

} 

Voici un exemple de sortie si j'accéder au service Web à partir d'un navigateur:

<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 est marshalled/unmarshalled avec succès mais une liste ne peut pas être unmarshalled pourquoi est-ce? Ni le serveur d'application, ni le client REST ne reçoivent aucune erreur ou exception, le client ignore simplement la liste des WorkflowSteps? À partir de l'exemple de sortie ci-dessus, je m'attendrais à ce que chaque élément soit converti en un objet de type WorkflowStep, puis sera automatiquement ajouté à la liste?

Répondre

6

Le problème avec cette méthode est:

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

Vos JAXB contrôles de mise en œuvre s'il existe déjà un List pour cette méthode, et s'il est qu'il utilise. Le List que vous renvoyez n'est pas détenu par l'objet que vous êtes unmarshalling, donc après l'opération unmarshal le List est perdu.

Option # 1 - Changer la getSteps() Méthode

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

Option # 2 - Utiliser le terrain Accès

Vous pouvez modifier ce votre préciser que JAXB doit utiliser l'accès sur le terrain.

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

Pour plus d'informations

+0

Comment faire? – LordDoskias

+0

@LordDoskias - J'ai ajouté des informations supplémentaires pour spécifier l'accès au champ. –

+1

J'ai vu après je me suis rafraîchi. Pouces vers le haut! – LordDoskias