2017-06-16 2 views
1

J'ai ce xmlUnmarshal Liste aux types

<data-set> 
    <list-property name="columns">...</list-property> 
    <list-property name="resultSet">...</list-property> 
<data-set> 

Nécessité de désorganiser ce pour objet:

public class DataSet { 

    private Columns columns; 

    private ResultSet resultSet; 
    ... 
} 

Aidez-moi à mettre en œuvre que si possible.

Mise à jour Ce que j'ai essayé de faire:

public class DataSet { 

    @XmlElement("list-property") 
    @XmlJavaTypeAdapter(DataSetListPropertyAdapter.class) 
    private Columns columns; 

    @XmlElement("list-property") 
    @XmlJavaTypeAdapter(DataSetListPropertyAdapter.class) 
    private ResultSet resultSet; 

    ... 
} 

public class DataSetListPropertyAdapter extends XmlAdapter<ListProperty, ListProperty> { 
@Override 
public ListProperty unmarshal(ListProperty v) throws Exception { 
    ListProperty listProperty; 
    switch (v.getName()) { 
     case "columns": 
      listProperty = new Columns(); 
      break; 
     case "resultSet": 
      listProperty = new ResultSet(); 
      break; 
     default: 
      listProperty = new ListProperty(); 
    } 
    listProperty.setStructure(v.getStructure()); 
    return listProperty; 
} 

    @Override 
    public ListProperty marshal(ListProperty v) throws Exception { 
     return v; 
    } 
} 

public class Columns extends ListProperty { 
public Columns() { 
    name = "columns"; 
} 
} 

public class ListProperty extends NamedElement implements PropertyType{ 

@XmlElement(name = "structure") 
private List<Structure> structure = new ArrayList<>(); 
} 

@XmlTransient 
public class NamedElement { 

@XmlAttribute(name = "name", required = true) 
protected String name; 
} 

Quand aller unmarshalling alors seulement le premier élément d'objets annotés analysés. Un autre est nul. Quand je commente en premier, alors la seconde est analysée.

Répondre

1

Je ne pense pas que ce que vous essayez de faire soit possible avec l'implémentation de référence JAXB.

Cependant, si vous pouvez modifier la mise en œuvre, EclipseLink Moxy offrent la @XmlPath qui devrait résoudre votre problème:

public class DataSet { 

    @XmlPath("node[@name='columns']") 
    @XmlJavaTypeAdapter(DataSetListPropertyAdapter.class) 
    private Columns columns; 

    @XmlPath("node[@name='resultSet']") 
    @XmlJavaTypeAdapter(DataSetListPropertyAdapter.class) 
    private ResultSet resultSet; 

    ... 
} 

Plus sur @XmlPath: http://www.eclipse.org/eclipselink/documentation/2.4/moxy/advanced_concepts005.htm

+0

Thx pour votre réponse. Je pense que c'est ce dont j'ai besoin. Mais j'ai essayé d'installer MOXy et n'ai pas eu de succès. Le conteneur d'applications WebSphere que j'utilise a déjà JAXB Provider. Comment puis-je l'utiliser. J'ai essayé de changer les options du classloader en PARENT_LAST mais j'ai ensuite rencontré une erreur com.ibm.ws.webcontainer.exception.WebAppNotLoadedException: Impossible de charger la webapp: javax.servlet.ServletContainerInitializer: Provider org.springframework.web.SpringServletContainerInitializer n'est pas un sous-type. WebSphere 8.5.5.11 –

+0

Avez-vous suivi les instructions suivantes: http://www.eclipse.org/eclipselink/documentation/2.5/solutions/websphere.htm? –

+0

Je pense que ça devrait être une autre question. THX –