Допустимый XML должен иметь root ошибка записи тега в XML файл - PullRequest
0 голосов
/ 12 февраля 2020

с использованием Jackson XML и StAX XmlStreamwriter Я пытаюсь вывести данные в файл XML. Первый класс ниже - это POJO, который составляет root элемент ...

@JacksonXmlRootElement(namespace = "http://ACORD.org/Standards/Life/2", localName = "TXLife")

publi c class TXLife {

@JacksonXmlProperty(localName = "Version", isAttribute = true)
private String version;

@JacksonXmlElementWrapper(useWrapping = false)
private List<TXLifeRequest> txLifeRequestListings = new ArrayList<TXLifeRequest>();

public TXLife() {
    super();
}

public TXLife(String version) {
    super();
    this.version = version;
}

public String getVersion() {
    return version;
}

public void setVersion(String version) {
    this.version = version;
}

public void add(TXLifeRequest txLifeRequest) {
    txLifeRequestListings.add(txLifeRequest);
}

public List<TXLifeRequest> getContent() {
    return txLifeRequestListings;
}

}

TXLifeRequest. java

@JacksonXmlRootElement

publi c class TXLifeRequest расширяет TXLife {

@JacksonXmlProperty(localName = "TransRefGUID")
private String transRefGUID;

@JacksonXmlProperty(localName = "TransType")
private TransType transType;

@JacksonXmlProperty(localName = "TransExeDate")
private String transExeDate;

@JacksonXmlProperty(localName = "TransExeTime")
private String transExeTime;

@JacksonXmlElementWrapper(useWrapping = false)
private List<OLifE> oLifEList;

public TXLifeRequest(String transRefGUID, TransType transType,
                     String transExeDate, String transExeTime, List<OLifE> oLifEList) {
    this.transRefGUID = transRefGUID;
    this.transType = transType;
    this.transExeDate = transExeDate;
    this.transExeTime = transExeTime;
    this.oLifEList = oLifEList;
}

public TXLifeRequest() {
}

public String getTransRefGUID() {
    return transRefGUID;
}

Это метод в XML классе построителя, который пытается записать в XML ...

public void writeToXml(String path, List<TXLifeRequest> txLifeRequestList) throws IOException, XMLStreamException, TransformerConfigurationException {

    try (OutputStream os = Files.newOutputStream(Paths.get(path))) {
        StringWriter sw = new StringWriter();
        XMLOutputFactory outputFactory = XMLOutputFactory.newFactory();
        XMLStreamWriter writer = null;
        XmlMapper xmlMapper = new XmlMapper();
       try {
            writer = outputFactory.createXMLStreamWriter(sw);

            writer.writeStartDocument("utf-8", "1.0");
            writer.writeStartElement("TXLife");
            writer.writeAttribute("xmlns", "", "xsi", XMLNSXSIURL);

            xmlMapper.writeValue(writer, txLifeRequestList);

            writer.writeEndElement();
            writer.writeEndDocument();
        } finally {
            if (writer != null) {
                writer.flush();
                writer.close();
            }
        }
    } catch (FileNotFoundException fnf) {
        fnf.getMessage();
    }
}

Я считаю, что строка writer.writeStartElement("TXLife"); может быть избыточной, поскольку я настроил хотя бы одно из пространств имен в TJLife POJO. Я получаю сообщение об ошибке:

javax. xml .stream.XMLStreamException: Невозможно вывести объявление XML, после того, как другой вывод уже сделан.

txLifeRequestList , который передается как второй параметр в вызове xmlmapper.writeValue , содержит список данных для заполнения различных элементов / атрибутов. Я понимаю, что ошибка сообщает, что xmlmapper пытается записать элемент root, когда уже есть вывод, который был записан в XML. Что-то отсутствует, вышло из строя, или я неправильно понял, как это работает с добавлением нескольких пространств имен к элементу root с использованием Jackson XML. Я должен отметить, что JAXB не является вариантом, так как я использую openjdk 12, который не поддерживает этот API.

Любые предложения будут с благодарностью. Спасибо!

...