首页 > 解决方案 > 用多个 XML 标签包装而不创建不同的类 + Jackson + Java

问题描述

我有这样的课:

class A {

    @JacksonXmlElementWrapper(localName = "ErrorMessages")
    @JacksonXmlProperty(localName = "ErrorMessage")
    List<String> errorMessages;

}

输出是:

<A>
    <ErrorMessages>
        <ErrorMessage>
            error1
        </ErrorMessage>

        <ErrorMessage>
            error2
        </ErrorMessage>

    </ErrorMessages>
</A>

但我希望它是那样的

<A>
    <ErrorMessages>
        <ErrorMessages>
            <ErrorMessage>
                error1
            </ErrorMessage>
        </ErrorMessages>
        <ErrorMessages>
            <ErrorMessage>
                error2
            </ErrorMessage>
        </ErrorMessages>
    </ErrorMessages>
</A>

如何在Jackson 不添加更多课程的情况下实现这一目标?对你的帮助表示感谢。谢谢。

标签: javaxmljackson

解决方案


您可以创建一个XmlAdapter为您的errorMessages字段生成任意 XML(在此答案中解释)。

例如,像这样注释你的类:

@XmlRootElement(name = "A")
class A {

    @XmlElement(name = "ErrorMessages")
    @XmlJavaTypeAdapter(ErrorMessagesAdapter.class)
    List<String> errorMessages;

}

并实现您的 ErrorMessagesAdapter,例如:

class ErrorMessagesAdapter extends XmlAdapter<Object, List<String>> {

    private DocumentBuilder documentBuilder;

    public ErrorMessagesAdapter() {
        super();
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            documentBuilder = dbf.newDocumentBuilder();
        } catch(Exception e) {
            // TODO: Handle Exception
        }
    }

    @Override
    public Object marshal(List<String> errorMessages) throws Exception {
        Document doc = documentBuilder.newDocument();
        Element root = doc.createElement("ErrorMessages");

        for (String errorMessage : errorMessages) {
            Element wrapperElement = doc.createElement("ErrorMessages");
            Element errorMessageElement = doc.createElement("ErrorMessage");
            errorMessageElement.setTextContent(errorMessage);
            wrapperElement.appendChild(errorMessageElement);
            root.appendChild(wrapperElement);
        }

        return root;
    }

    @Override
    public List<String> unmarshal(Object v) throws Exception {
        // TODO: implement unmarshalling
        throw new UnsupportedOperationException();
    }
}

这会产生以下输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<A>
  <ErrorMessages>
    <ErrorMessages>
      <ErrorMessage>error1</ErrorMessage>
    </ErrorMessages>
    <ErrorMessages>
      <ErrorMessage>error2</ErrorMessage>
    </ErrorMessages>
  </ErrorMessages>
</A>

推荐阅读