2015-11-11 2 views
0

Я пытаюсь сделать очень «абстрактный» метод для преобразования любого типа объекта в XML-String и наоборот, используя JAXB (javax.xml.bind.*). Я получаю очень странную ошибку, о которой я не знаю смысла.JAXB UnmarshallException неожиданный элемент, но «Ожидаемые элементы (нет)»

javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"Incident"). Expected elements are (none) 

Я искал множество решений в google и stackoverflow, но их решение, похоже, не помогает. Здесь я столкнулся с тупиком.

Мой метод конвертер

public Object convertXmlToObject(String string, Class c) throws ConversionException { 
     try { 
      JAXBContext jaxbContext = JAXBContext.newInstance(c.getClass()); 
      Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
      InputStream stream = new ByteArrayInputStream(string.getBytes(StandardCharsets.UTF_8)); 
      Object converted = jaxbUnmarshaller.unmarshal(stream); 
      return converted; 
     } catch (JAXBException e) { 
      e.printStackTrace(); 
      throw new ConversionException("Could not convert the message to an Object", e); 
     } 
    } 

где я вызываю метод

public void generateIncidentReport(Incident incident) throws RepositoryException, ConversionException { 
    ConversionTool conversionTool = new Converter(); 
    String xmlMessage = conversionTool.convertObjectToXml(incident); 
    //... 
} 

Мой Incident класс (который имеет ал необходимые аннотаций)

@XmlRootElement(name = "Incident") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Incident { 
    @XmlElement(name = "shipId") 
    private int shipID; 
    @XmlElement(name = "incidentType") 
    private String type; 
    @XmlElement(name = "action") 
    private String action; 
    @XmlElement(name = "centraleID") 
    private String centraleID; 
    @XmlElement(name = "Ship") 
    private Ship ship; 

    public Incident() { 
    } 
    //getters and setters 
} 

и последний XML-строка

<Incident><incidentType>Medisch noodgeval</incidentType><shipId>1234567</shipId></Incident> 

ответ

1

Пишешь

JAXBContext jaxbContext = JAXBContext.newInstance(c.getClass()); 

с c уже есть класс, создавая тем самым контекст для java.lang.Class. Что вам нужно -

JAXBContext jaxbContext = JAXBContext.newInstance(c); 
+0

Черт возьми, как я мог быть настолько слепым, это, очевидно, сработало. Вот почему программирование более 18 часов прямо не является хорошей идеей. Урок хорошо изучен, собираюсь схватить кофе. – Edward

Смежные вопросы