2011-02-03 9 views
5

Tengo problemas para tratar de asignar elementos anidados en la misma clase Java.JAXB2: asignación de elementos anidados en la misma clase Java

XML

Lo que estoy tratando de hacer aquí es fijar id atributo y text elemento en SlideText clase.

<module name="test project"> 
    <slide id="1"> 
     <layout> 
      <text>hello</text> 
     </layout> 
    </slide> 
</module> 

clase Módulo

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Module { 
    @XmlAttribute 
    private String name; 

    @XmlElements({ 
     @XmlElement(name = "slide", type = SlideText.class) 
    }) 
    private Slide slide; 
} 

clase Slide clase

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public abstract class Slide { 
    @XmlAttribute 
    private String id; 
} 

SlideText

I t ried utilizando @XmlElementWrapper en la propiedad text, pero aparece la excepción de que @XmlElementWrapper solo se puede aplicar a una colección.

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class SlideText extends Slide { 

    // how to map this to layout/text elements? 
    private String text; 
} 

¿Hay una manera de hacer corresponder <layout><text>hello</text></layout> en text propiedad SlideText 's?

Gracias.

ACTUALIZACIÓN

Para ilustrar lo que estoy tratando de lograr aquí, la corredera puede ser de cualquier tipo en función de lo que el diseño se utiliza. Un module sabe que es un slide pero no sabe qué diapositiva es, razón por la cual tengo la clase abstracta Slide.

Básicamente, si esto funciona, voy a crear SlideImage y SlideTextVideo que se extiende Slide.

Así es como el archivo XML real se parece a: -

<module name="test project"> 
    <slide id="1"> 
     <layout-text> 
      <text>hello</text> 
     </layout-text> 
    </slide> 
</module> 
<module name="test project"> 
    <slide id="2"> 
     <layout-image> 
      <image-path>img.jpg</image-path> 
     </layout-image> 
    </slide> 
</module> 
<module name="test project"> 
    <slide id="3"> 
     <layout-text-video> 
      <text>hello</text> 
      <video-path>a.mp4</video-path> 
     </layout-text-video> 
    </slide> 
</module> 
+0

Slide es un tipo complejo. Defínalo como otro objeto y coloca el otro en esta clase. ¿Esto no funciona para ti? – fmucar

+0

@fmucar: Agregué más razonamiento a mi publicación anterior. – limc

+1

Nota al margen: no necesita '@ XmlRootElement' en ninguna clase que no sea' Module', suponiendo que siempre será el elemento raíz del documento XML. – earldouglas

Respuesta

3

Si utiliza EclipseLink JAXB (MOXy) continuación, puede aprovechar la extensión @XmlPath para este (I soy el líder tecnológico de MOXy):

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlRootElement; 

import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class SlideText extends Slide { 

    @XmlPath("layout/text/text()") 
    private String text; 

} 

El uso estándar de JAXB se podría aprovechar un XmlAdapter:

+0

No puedo hacer que funcione. Tenía ese '@ XmlPath' igual que el suyo, pero el' text' sigue siendo nulo. – limc

+0

Estoy usando Moxy 2.3.0-M5, si hace alguna diferencia. :) – limc

+1

Bien, lo arreglé. Me falta el archivo 'jaxb.properties'. Wow, esto es increíble! ¡Gracias! – limc

0

añade una nueva clase Layout:

public class SlideText extends Slide { 
    @XmlElement 
    private Layout layout; 
} 

public class Layout { 
    @XmlAttribute 
    private String text; 
} 
+1

¿Es posible no definir la clase 'Diseño 'en absoluto? Espero tener toda la información en las clases concretas de 'Slide'. Gracias. – limc

+0

Puede tratar de convertirlo en una clase anónima dentro de 'Slide' o' SlideText'. – earldouglas

Cuestiones relacionadas