Printemps de Démarrage de lot - lire le XML d'entrée - de convertir des éléments de liste
Je code un lot de services, à l'aide de Spring Boot, qui lit un fichier XML en entrée.
La structure XML d'entrée ressemble à ça, et je ne peux pas la changer :
<root>
<parent>
<field1>string</field1>
<field2>string</field2>
<field3>string</field2>
<child>
<fieldA>string</fieldA>
<fieldB>string</fieldB>
</child>
<child>
<fieldA>string</fieldA>
<fieldB>string</fieldB>
</child>
<child>
<fieldA>string</fieldA>
<fieldB>string</fieldB>
</child>
</parent>
</root>
J'ai créé mes classes Java :
public class Parent {
private String field1;
private String field2;
private String field3;
private List<Child> children;
//Getters and setters...
}
public class Child {
private String fieldA;
private String fieldB;
//Getters and setters...
}
Et voici mon lecteur dans le lot de configuration de la classe :
@Bean
public ItemReader<Object> reader(){
StaxEventItemReader<Object> reader = new StaxEventItemReader<Object>();
reader.setResource( new ClassPathResource("input.xml") );
reader.setFragmentRootElementName("parent");
XStreamMarshaller unmarshaller = new XStreamMarshaller();
Map<String, Class> aliases = new HashMap<String, Class>();
aliases.put( "parent", Parent.class );
aliases.put( "child", Child.class );
unmarshaller.setAliases(aliases);
reader.setUnmarshaller( unmarshaller );
return reader;
}
Pour l'instant j'essaie juste d'avoir une lecture correcte.
Mais quand je lance le batch, j'ai une erreur :
org.springframework.oxm.UnmarshallingFailureException: XStream unmarshalling exception; nested exception is com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field foo.bar.Parent.child
Je comprends cette erreur, mais je ne peux pas trouver un moyen de corriger mon code.
J'ai essayé de créer un faux setter dans le Parent, l'ajout de l'enfant à la liste des enfants. Mais il ne semble pas fonctionner.
Une idée ?
OriginalL'auteur Eria | 2015-10-09
Vous devez vous connecter pour publier un commentaire.
J'ai résolu le problème en utilisant Jaxb2Marshaller au lieu de XStreamMarshaller :
Et pour Java beans :
Cela fonctionne bien, même avec l'auto-générés getters et setters : j'ai récupérer une liste des éléments enfants.
Vous êtes les bienvenus ! Il m'a sauvé des heures de trop.
OriginalL'auteur Eria
renommer cette propriété:
à
et de recréer les getter et setter.
OriginalL'auteur Jens