Mapeamento de herança com JaxB

1 resposta
java
T

Pessoal estou com um problema.
Estou mapeando o xml em objetos java usando jaxb
Estou tentado mapear lista de objetos de um tipo base. Tenho as seguintes classes:

@XmlRootElement (name = SldData)

@XmlAccessorType (XmlAccessType.FIELD)

public class SldData {
@XmlElement
private String name;
@XmlElementRef
private List<RuleData> rules;

@XmlAccessorType (XmlAccessType.FIELD)
public class RuleData {

@XmlElement
private String name;

@XmlJavaTypeAdapter(SymbolizerAdapter.class)
private List<SymbolizerData> symbolizer;
@XmlJavaTypeAdapter(SymbolizerAdapter.class)

public class SymbolizerData {

@XmlElement

private String stroke;
@XmlElement
private String strokeWidth;

@XmlAccessorType (XmlAccessType.FIELD)
public class PolygonSymbolizerData extends SymbolizerData {

@XmlElement
private String fill;

@XmlElement
private String fillWidth;

Ou seja na classe RuleData tem uma lista de SymbolizerData que pode ser estendida por outras classes como PolygonSymbolizerData. Já tentei vária soluções mas ainda não consegui resolver.Uma delas foi utilizando o apdater

public class SymbolizerAdapter extends XmlAdapter<SymbolizerData, List>{

@Override
public List<SymbolizerData> unmarshal(SymbolizerData v)
		throws Exception {
	// TODO Auto-generated method stub
	return null;
}

@Override
public PolygonSymbolizerData marshal(List<SymbolizerData> v)
		throws Exception {
	// TODO Auto-generated method stub
	return null;
}

}

Mas não consegui nem chegar a executar ele, estou com o seguinte erro

HTTP Status 400 - org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field “fill” (Class publisher.model.sld.SymbolizerData), not marked as ignorable at [Source: org.apache.catalina.connector.CoyoteInputStream@4b36e6a5; line: 1, column: 67] (through reference chain: publisher.model.sld.SldData[“rules”]->publisher.model.sld.RuleData[“symbolizer”]->publisher.model.sld.SymbolizerData[“fill”])

Ele não está reconhecendo o tipo PolygonSymbolizerData, o xml enviado esta da seguinte forma:

> <?xml version="1.0" encoding="UTF-8" ?>
>        <name>nameSld</name>
> 	<rules>
> 		<name>teste</name>
> 		<symbolizer>
> 			<fill>F</fill>
> 			<fillWidth>F</fillWidth>
> 			<stroke>ST</stroke>
> 			<strokeWidth>SD</strokeWidth>
> 		</symbolizer>
> 	</rules>

Alguém sabe o que está acontecendo?

Obrigado

1 Resposta

C

Boa tarde,

Creio que o seu mapeamento esta errado. Deveria ser List<PolygonSymbolizerData>

Veja:

@XmlRootElement(name = "SldData")
@XmlAccessorType(XmlAccessType.FIELD)
public class SldData {

	@XmlElement
	private String name;
	
	@XmlElement(name = "rules")
	private List<RuleData> rules;
}
@XmlAccessorType(XmlAccessType.FIELD)
public class RuleData {

	@XmlElement
	private String name;

	@XmlElement(name = "symbolizer")
	private List<PolygonSymbolizerData> symbolizer;
}
@XmlAccessorType(XmlAccessType.FIELD) //opcional
public class SymbolizerData {
	
	@XmlElement
	private String stroke;

	@XmlElement
	private String strokeWidth;
}
@XmlAccessorType(XmlAccessType.FIELD)
public class PolygonSymbolizerData extends SymbolizerData {

	@XmlElement
	private String fill;

	@XmlElement
	private String fillWidth;
}

Teste:

symbolizerData = new PolygonSymbolizerData();
		symbolizerData.setFill("Fill");
		symbolizerData.setFillWidth("fillWidth");
		symbolizerData.setStroke("symbolizerData");
		symbolizerData.setStrokeWidth("sttrokewidt");
		
		List<PolygonSymbolizerData> symbolizer = new ArrayList<PolygonSymbolizerData>();
		symbolizer.add(symbolizerData);

		ruleData = new RuleData();
		ruleData.setName("ruleData");
		ruleData.setSymbolizer(symbolizer);

		List<RuleData> rules = new ArrayList<RuleData>();
		rules.add(ruleData);

		sldData = new SldData();
		sldData.setName("sldData");
		sldData.setRules(rules);

		try {
			Marshaller m = JAXBContext.newInstance(SldData.class)
					.createMarshaller();
			m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
			final StringWriter w = new StringWriter();
			m.marshal(sldData, w);
			System.out.println(w.toString());
		} catch (JAXBException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

Resultado:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SldData>
    <name>sldData</name>
    <rules>
        <name>ruleData</name>
        <symbolizer>
            <stroke>symbolizerData</stroke>
            <strokeWidth>sttrokewidt</strokeWidth>
            <fill>Fill</fill>
            <fillWidth>fillWidth</fillWidth>
        </symbolizer>
    </rules>
</SldData>
Criado 23 de fevereiro de 2016
Ultima resposta 23 de fev. de 2016
Respostas 1
Participantes 2