2012-03-25 1 views
1

Ich habe ein Problem beim Unmarshalling einer .xml bei einem Web-Service mit JAXB.Wie kann ich mit JAXB unmarshal

Dies ist die XML-Datei, die von einem Client an den Webdienst gesendet wird.

<?xml version="1.0" encoding="UTF-8"?> 
<PERSON xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="file:/D:/MyWorkSpace/JAVA%20WEB%20Services%20DEVELOPER/XML%20Workspace/Persons.xsd"> 
    <NAME>Michael</NAME> 
    <AGE>12</AGE> 
    <ADRESS> 
     <STREET>Somewhere in Spain</STREET> 
     <ZIP>47015</ZIP> 
    </ADRESS> 
    <HOBY indoorHoby="true"/> 
</PERSON> 

Dies ist die Methode, die die Unmarshalling

@POST 
    @Path("/XMLArrivalBeacon") 
    @Consumes(MediaType.APPLICATION_XML) 
    public Response methodI(String content) { 
     System.out.print(content); 
     try { 
      //Unmarshaling    
      JAXBContext context = JAXBContext.newInstance(Person.class); 
      Unmarshaller unmarshaller = context.createUnmarshaller(); 
      //Unmarshal the String 
      Person person = (Person) unmarshaller.unmarshal(new StreamSource(new StringReader(content))); 
      //Checking that the values were recieved ok 
      System.out.print(person.getName()); 
      return Response.ok("XML recieved from client!!!").build(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

Hier wird die Person-Klasse mit den JAXB Anmerkungen kommentiert tut (automatisch aus dem Schema generiert wurde)

package bindedschemas; 

import java.math.BigInteger; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 


/** 
* <p>Java class for anonymous complex type. 
* 
* <p>The following schema fragment specifies the expected content contained within this class. 
* 
* <pre> 
* &lt;complexType> 
* &lt;complexContent> 
*  &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> 
*  &lt;sequence> 
*   &lt;element name="name" type="{http://www.w3.org/2001/XMLSchema}string"/> 
*   &lt;element name="age"> 
*   &lt;simpleType> 
*    &lt;restriction base="{http://www.w3.org/2001/XMLSchema}integer"> 
*    &lt;minInclusive value="18"/> 
*    &lt;/restriction> 
*   &lt;/simpleType> 
*   &lt;/element> 
*   &lt;element name="address"> 
*   &lt;complexType> 
*    &lt;complexContent> 
*    &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> 
*     &lt;sequence> 
*     &lt;element name="street" type="{http://www.w3.org/2001/XMLSchema}string"/> 
*     &lt;element name="zip" type="{http://www.w3.org/2001/XMLSchema}string"/> 
*     &lt;/sequence> 
*     &lt;attribute name="country" type="{http://www.w3.org/2001/XMLSchema}string" /> 
*    &lt;/restriction> 
*    &lt;/complexContent> 
*   &lt;/complexType> 
*   &lt;/element> 
*   &lt;element name="hobie"> 
*   &lt;simpleType> 
*    &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string"> 
*    &lt;/restriction> 
*   &lt;/simpleType> 
*   &lt;/element> 
*  &lt;/sequence> 
*  &lt;/restriction> 
* &lt;/complexContent> 
* &lt;/complexType> 
* </pre> 
* 
* 
*/ 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "name", 
    "age", 
    "address", 
    "hobie" 
}) 
@XmlRootElement(name = "Person") 
public class Person { 

    @XmlElement(required = true) 
    protected String name; 
    @XmlElement(required = true) 
    protected BigInteger age; 
    @XmlElement(required = true) 
    protected Person.Address address; 
    @XmlElement(required = true) 
    protected String hobie; 

    /** 
    * Gets the value of the name property. 
    * 
    * @return 
    *  possible object is 
    *  {@link String } 
    *  
    */ 
    public String getName() { 
     return name; 
    } 

    /** 
    * Sets the value of the name property. 
    * 
    * @param value 
    *  allowed object is 
    *  {@link String } 
    *  
    */ 
    public void setName(String value) { 
     this.name = value; 
    } 

    /** 
    * Gets the value of the age property. 
    * 
    * @return 
    *  possible object is 
    *  {@link BigInteger } 
    *  
    */ 
    public BigInteger getAge() { 
     return age; 
    } 

    /** 
    * Sets the value of the age property. 
    * 
    * @param value 
    *  allowed object is 
    *  {@link BigInteger } 
    *  
    */ 
    public void setAge(BigInteger value) { 
     this.age = value; 
    } 

    /** 
    * Gets the value of the address property. 
    * 
    * @return 
    *  possible object is 
    *  {@link Person.Address } 
    *  
    */ 
    public Person.Address getAddress() { 
     return address; 
    } 

    /** 
    * Sets the value of the address property. 
    * 
    * @param value 
    *  allowed object is 
    *  {@link Person.Address } 
    *  
    */ 
    public void setAddress(Person.Address value) { 
     this.address = value; 
    } 

    /** 
    * Gets the value of the hobie property. 
    * 
    * @return 
    *  possible object is 
    *  {@link String } 
    *  
    */ 
    public String getHobie() { 
     return hobie; 
    } 

    /** 
    * Sets the value of the hobie property. 
    * 
    * @param value 
    *  allowed object is 
    *  {@link String } 
    *  
    */ 
    public void setHobie(String value) { 
     this.hobie = value; 
    } 


    /** 
    * <p>Java class for anonymous complex type. 
    * 
    * <p>The following schema fragment specifies the expected content contained within this class. 
    * 
    * <pre> 
    * &lt;complexType> 
    * &lt;complexContent> 
    *  &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> 
    *  &lt;sequence> 
    *   &lt;element name="street" type="{http://www.w3.org/2001/XMLSchema}string"/> 
    *   &lt;element name="zip" type="{http://www.w3.org/2001/XMLSchema}string"/> 
    *  &lt;/sequence> 
    *  &lt;attribute name="country" type="{http://www.w3.org/2001/XMLSchema}string" /> 
    *  &lt;/restriction> 
    * &lt;/complexContent> 
    * &lt;/complexType> 
    * </pre> 
    * 
    * 
    */ 
    @XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name = "", propOrder = { 
     "street", 
     "zip" 
    }) 
    public static class Address { 

     @XmlElement(required = true) 
     protected String street; 
     @XmlElement(required = true) 
     protected String zip; 
     @XmlAttribute(name = "country") 
     protected String country; 

     /** 
     * Gets the value of the street property. 
     * 
     * @return 
     *  possible object is 
     *  {@link String } 
     *  
     */ 
     public String getStreet() { 
      return street; 
     } 

     /** 
     * Sets the value of the street property. 
     * 
     * @param value 
     *  allowed object is 
     *  {@link String } 
     *  
     */ 
     public void setStreet(String value) { 
      this.street = value; 
     } 

     /** 
     * Gets the value of the zip property. 
     * 
     * @return 
     *  possible object is 
     *  {@link String } 
     *  
     */ 
     public String getZip() { 
      return zip; 
     } 

     /** 
     * Sets the value of the zip property. 
     * 
     * @param value 
     *  allowed object is 
     *  {@link String } 
     *  
     */ 
     public void setZip(String value) { 
      this.zip = value; 
     } 

     /** 
     * Gets the value of the country property. 
     * 
     * @return 
     *  possible object is 
     *  {@link String } 
     *  
     */ 
     public String getCountry() { 
      return country; 
     } 

     /** 
     * Sets the value of the country property. 
     * 
     * @param value 
     *  allowed object is 
     *  {@link String } 
     *  
     */ 
     public void setCountry(String value) { 
      this.country = value; 
     } 

    } 

} 

Und das ist das excepti javax.xml.bind.UnmarshalException: unerwartetes Element (uri: "", local: "Person") auf i

SCHWERE bekommen. Erwartete Elemente sind < {} Person> bei com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent (UnmarshallingContext.java:662) bei com.sun.xml.bind.v2.runtime.unmarshaller .Loader.reportError (Loader.java:258) bei com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError (Loader.java:253)

Jede Idee, wie kann ich das beheben es?

Antwort

6

Ihr XML stimmt nicht mit Ihrem Schema überein. xml-Elementnamen sind case sensitive. "PERSON" und "Person" sind nicht das gleiche Element.

+1

Ja das war es. Dummer Fehler :) Danke – sfrj