Как я могу разобраться с JAXB - PullRequest
1 голос
/ 25 марта 2012

У меня возникла проблема при демаршалировании .xml в веб-службе с использованием JAXB.

Это файл .xml, отправляемый с какого-либо клиента в веб-службу.

<?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>

Это метод, который выполняет демаршалинг

    @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;
    }

Вот класс person, снабженный аннотациями JAXB (был автоматически сгенерирован из схемы)

<code>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>
 * 
* * * / @XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "", propOrder = {"name", "age", "address", "hobie"}) @XmlRootElement(name = "Person") открытый класс Person {@XmlElement (обязательно = true) защищенное строковое имя;@XmlElement (обязательно = true) защищенный возраст BigInteger;@XmlElement (обязательный = true) защищенный Person.Address address;@XmlElement (обязательный = true) защищенный String hobie;/ ** * Получает значение свойства name.* * @return * возможным объектом является * {@link String} * * / public String getName () {return name;} / ** * Устанавливает значение свойства name.* * @param value * допустимым объектом является * {@link String} * * / public void setName (String value) {this.name = value;} / ** * Получает значение свойства age.* * @return * возможным объектом является * {@link BigInteger} * * / public BigInteger getAge () {return age;} / ** * Устанавливает значение свойства age.* * @param value * допустимым объектом является * {@link BigInteger} * * / public void setAge (BigInteger value) {this.age = value;} / ** * Получает значение свойства адреса.* * @return * возможным объектом является * {@link Person.Address} * * / public Person.Address getAddress () {обратный адрес;} / ** * Устанавливает значение свойства адреса.* * @param value * допустимым объектом является * {@link Person.Address} * * / public void setAddress (Person.Address value) {this.address = value;} / ** * Получает значение свойства hobie.* * @return * возможным объектом является * {@link String} * * / public String getHobie () {return hobie;} / ** * Устанавливает значение свойства hobie.* * @param value * допустимым объектом является * {@link String} * * / public void setHobie (String value) {this.hobie = value;} / ** *

Java-класс для анонимного сложного типа.* *

Следующий фрагмент схемы определяет ожидаемое содержимое, содержащееся в этом классе.* *

     * &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>
     * 
* * * / @XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "", propOrder = {"street", "zip"}) открытый статический класс Address {@XmlElement (required = true) защищенная строкаулица;@XmlElement (обязательно = true) защищенный String zip;@XmlAttribute (name = "country") защищенная строковая страна;/ ** * Получает значение свойства улицы.* * @return * возможным объектом является * {@link String} * * / public String getStreet () {return street;} / ** * Устанавливает значение свойства улицы.* * @param value * допустимым объектом является * {@link String} * * / public void setStreet (String value) {this.street = value;} / ** * Получает значение свойства zip.* * @return * возможным объектом является * {@link String}* * / public String getZip () {return zip;} / ** * Устанавливает значение свойства zip.* * @param value * допустимым объектом является * {@link String} * * / public void setZip (String value) {this.zip = value;} / ** * Получает значение свойства страны.* * @return * возможным объектом является * {@link String} * * / public String getCountry () {return country;} / ** * Устанавливает значение свойства страны.* * @param value * допустимым объектом является * {@link String} * * / public void setCountry (String value) {this.country = value;}}}

И это исключение, которое я получаю

SEVERE: javax.xml.bind.UnmarshalException: непредвиденный элемент (uri: "", местное:" ЧЕЛОВЕК ").Ожидаемые элементы: <{} Person> в com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent (UnmarshallingContext.java:662) в com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError (Loader.java:258) на com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError (Loader.java:253)

Есть идеи, как это исправить?

1 Ответ

6 голосов
/ 25 марта 2012

Ваш xml не соответствует вашей схеме.Имена элементов xml чувствительны к регистру .«ЛИЦО» и «Персона» не один и тот же элемент.

...