У меня возникла проблема при демаршалировании .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>
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="name" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="age">
* <simpleType>
* <restriction base="{http://www.w3.org/2001/XMLSchema}integer">
* <minInclusive value="18"/>
* </restriction>
* </simpleType>
* </element>
* <element name="address">
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="street" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="zip" type="{http://www.w3.org/2001/XMLSchema}string"/>
* </sequence>
* <attribute name="country" type="{http://www.w3.org/2001/XMLSchema}string" />
* </restriction>
* </complexContent>
* </complexType>
* </element>
* <element name="hobie">
* <simpleType>
* <restriction base="{http://www.w3.org/2001/XMLSchema}string">
* </restriction>
* </simpleType>
* </element>
* </sequence>
* </restriction>
* </complexContent>
* </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-класс для анонимного сложного типа.* *
Следующий фрагмент схемы определяет ожидаемое содержимое, содержащееся в этом классе.* *
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="street" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="zip" type="{http://www.w3.org/2001/XMLSchema}string"/>
* </sequence>
* <attribute name="country" type="{http://www.w3.org/2001/XMLSchema}string" />
* </restriction>
* </complexContent>
* </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)
Есть идеи, как это исправить?