2012-09-06 98 views
5

estoy recibiendo el siguiente error al intentar convertir la respuesta XML a objetos Java utilizando jaxbjavax.xml.bind.UnmarshalException: elemento inesperado (URI:

 javax.xml.bind.UnmarshalException: unexpected element (uri:"http://SOMETHING/doc/2006-03-01/", local:"Name"). Expected elements are <{}Name>,<{}IsTruncated>,<{}MaxKeys>,<{}Contents>,<{}Prefix>,<{}Marker> 

Aquí está mi XML:

 <ListBucketResult xmlns="http://something/doc/2006-03-01/"> 
      <Name>test2</Name> 
      <Prefix/> 
      <Marker/> 
      <MaxKeys>3</MaxKeys> 
      <IsTruncated>false</IsTruncated> 
      <Contents> 
        <Key>metadata.xml</Key> 
        <LastModified>2012-09-04T08:29:36.000Z</LastModified> 
        <ETag>6b836fd43c402681506926b2248ec418</ETag> 
        <Size>3258</Size> 
        <StorageClass>STANDARD</StorageClass> 
      </Contents> 
      </ListBucketResult> 

y mi objeto java clases son algo como esto

  @XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name = "", propOrder = { 
     "name", 
     "prefix", 
     "marker", 
     "maxKeys", 
     "isTruncated", 
     "contents" 
    }) 
    @XmlRootElement(name = "ListBucketResult") 
    public class ListBucketResult { 

@XmlElement(name = "Name", required = true) 
protected String name; 
@XmlElement(name = "Prefix", required = true) 
protected String prefix; 
@XmlElement(name = "Marker", required = true) 
protected String marker; 
@XmlElement(name = "MaxKeys") 
protected int maxKeys; 
@XmlElement(name = "IsTruncated") 
protected boolean isTruncated; 
@XmlElement(name = "Contents", required = true) 
protected ListBucketResult.Contents contents; 







     @XmlAccessorType(XmlAccessType.FIELD) 
     @XmlType(name = "", propOrder = { 
       "key", 
       "lastModified", 
        "eTag", 
        "size", 
       "storageClass" 
      }) 
      public static class Contents { 

    @XmlElement(name = "Key", required = true) 
    protected String key; 
    @XmlElement(name = "LastModified", required = true) 
    @XmlSchemaType(name = "dateTime") 
    protected XMLGregorianCalendar lastModified; 
    @XmlElement(name = "ETag", required = true) 
    protected String eTag; 
    @XmlElement(name = "Size") 
    protected int size; 
    @XmlElement(name = "StorageClass", required = true) 
    protected String storageClass; 

y, finalmente, mi código es unmarshalling:

      JAXBContext jc = JAXBContext.newInstance(ListBucketResult.class); 
      Unmarshaller unmarshaller = jc.createUnmarshaller(); 
      unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler()); 
       JAXBElement element = (JAXBElement) unmarshaller.unmarshal (inputStream); 
      ListBucketResult customer = (ListBucketResult) element.getValue(); 

¿Podría alguien decirme por favor qué estoy haciendo incorrecto?

Respuesta

3

El documento XML contiene elementos que forman parte del espacio de nombres 'http: // something/doc/2006-03-01 /', pero la clase java anotada no está asociada con ese espacio de nombres. Intente cambiar la anotación @XmlType a:

@XmlType(name = "", namespace="http://something/doc/2006-03-01/", propOrder = { ... 
+0

Hola, Cambiando esto didnt help. \t @XmlAccessorType (XmlAccessType.CAMPO) \t \t @XmlType (name = "", espacio de nombres = "http: // algo/doc/2006-03-01 /", propOrder = { \t \t "nombre", \t \t "prefijo", \t \t "marcador", \t \t "maxKeys", \t \t "isTruncated", \t \t "contenido" \t \t}) – Yahiya

+1

ayuda de nadie? – Yahiya

+1

Independientemente del mecanismo, el problema es un problema de espacio de nombres. El método de excepción indica que se proporcionó un elemento con un nombre totalmente calificado de {http: // SOMETHING/doc/2006-03-01 /} Name (que es correcto según el xml proporcionado) pero que es un elemento de {} Nombre (entre otros) es esperado. Este último es un elemento en el espacio de nombres predeterminado. ¿La excepción * exactamente * es la misma ahora o ha cambiado levemente? – dcbyers

5

Puede utilizar la anotación @XmlSchema en una clase package-info para controlar la calificación de espacio de nombres. Si ya ha escrito una clase de información del paquete, asegúrese de que esté siendo compilada (algunas versiones de la hormiga tenían problemas con las clases de información del paquete).

paquete de información-

@XmlSchema( 
    namespace = "http://something/doc/2006-03-01/", 
    elementFormDefault = XmlNsForm.QUALIFIED) 
package example; 

import javax.xml.bind.annotation.XmlNsForm; 
import javax.xml.bind.annotation.XmlSchema; 

Para más información

0

que estaba recibiendo de error similar org.codehaus.jackson.JsonParseException y javax.xml.bind.UnmarshalException: con excepción vinculada: [javax.xml.bind.UnmarshalException: elemento inesperado (uri: "sometext", local: "elementA"). Los elementos esperados son.

Ésta es la hora de integrar RESTEasy y primavera con de mi DTO genera utilizando JAXB . Estaba usando Jackson para la conversión.

Para resolverlo presenté la librería Jackson en la dependencia de Maven y resolvió mi problema. La dependencia Jackson que es específica para esto era

<dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-xc</artifactId> 
     <version>1.9.9</version> 
    </dependency> 

Había otros frascos Jackson, así, que necesitaba, así que mi POM Esencialmente parecía que a continuación.

//The jackson-core-asl jar contains streaming JSON parser and generator interfaces and implementations 
<dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-core-asl</artifactId> 
     <version>1.9.9</version> 
    </dependency> 
//Ability to use JAXB annotations containing classes needed to add XML compatibility support. 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-xc</artifactId> 
     <version>1.9.9</version> 
    </dependency> 
    //Mapper jar contains functionality for data binding: 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.9</version> 
    </dependency> //This dependency makes a JAX-RS implementation like Jersey,RESTEasy use Jackson for binding of JSON to-from Java objects 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-jaxrs</artifactId> 
     <version>1.9.9</version> 
    </dependency> 
Cuestiones relacionadas