You can nearly always enjoy something, if you make up your mind firmly that you will. 只要你下决心去做某件事,总能从中找到乐趣。

1、JAXB Annotation 注解

  • @XmlRootElement // xml 文件的根元素
  • @XmlElement
  • @XmlAccessorType // 控制默认情况下是否对字段或 Javabean 属性进行系列化。
  • @XmlTransient
  • @XmlJavaTypeAdaptor:参考Using JAXB 2.0

2、bean简单示例

import javax.xml.bind.annotation.*;

@XmlRootElement(name = "request")
public class YDCreateTemplateRequest {

    /**
     * 模板名称, 长度上限30
     */
    @XmlElement
    private String templateName;

    /**
     * 短信内容
     */
    @XmlElement
    private String smsTemplate;

    /**
     * 模板内容类型, 1-文本, 2-多媒体, 3-卡片
     */
    @XmlElement
    private String contentType;

    /**
     * 模板内容。 使用JSON格式, 填写contents和suggestions。
     */
    @XmlElement
    private String bodyTextTemplate;

    /**
     * 是否提交审核, 缺省false
     */
    @XmlElement
    private String submit = "true";

    /**
     * 回落up1.0内容, 参考示例和回落内容说明
     */
    @XmlElement
    private String fallbackTemplate;

    @XmlTransient
    public String getTemplateName() {
        return templateName;
    }

    public void setTemplateName(String templateName) {
        this.templateName = templateName;
    }
    @XmlTransient
    public String getSmsTemplate() {
        return smsTemplate;
    }

    public void setSmsTemplate(String smsTemplate) {
        this.smsTemplate = smsTemplate;
    }
    @XmlTransient
    public String getContentType() {
        return contentType;
    }

    public void setContentType(String contentType) {
        this.contentType = contentType;
    }
    @XmlTransient
    public String getBodyTextTemplate() {
        return bodyTextTemplate;
    }

    public void setBodyTextTemplate(String bodyTextTemplate) {
        this.bodyTextTemplate = bodyTextTemplate;
    }
    @XmlTransient
    public String getSubmit() {
        return submit;
    }

    public void setSubmit(String submit) {
        this.submit = submit;
    }
    @XmlTransient
    public String getFallbackTemplate() {
        return fallbackTemplate;
    }

    public void setFallbackTemplate(String fallbackTemplate) {
        this.fallbackTemplate = fallbackTemplate;
    }
}

3、<![CDATA[]]包装

import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.transform.sax.SAXResult;
import java.io.ByteArrayOutputStream;

public class XmlGeneratorUtil {


    /**
     *
     * @param clazz obj的class
     * @param obj obj
     * @param cDataElements 格式:String[] cData = new String[]{"^bodyTextTemplate","^fallbackTemplate"};
     * @return
     * @throws Exception
     */
    public static String objectToXmlWithCDATA(Class clazz, Object obj, String[] cDataElements) throws Exception {

        JAXBContext context = JAXBContext.newInstance(clazz);
        // configure an OutputFormat to handle CDATA
        OutputFormat of = new OutputFormat();
        of.setCDataElements(cDataElements); //

        // set any other options you'd like
        of.setPreserveSpace(true);
        of.setIndenting(true);
        // create the serializer
        ByteArrayOutputStream op = new ByteArrayOutputStream();
        XMLSerializer serializer = new XMLSerializer(op, of);
        SAXResult result = new SAXResult(serializer.asContentHandler());
        Marshaller mar = context.createMarshaller();
        mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        mar.marshal(obj, result);

        return op.toString("utf-8");
    }
}

4、测试

@Test
    public void bean2XmlTest() throws Exception {


        YDCreateTemplateRequest yd = new YDCreateTemplateRequest();

        yd.setTemplateName("模板名称测试");
        yd.setContentType("1");

        Map<String, Object> bodyTextTemplate = new HashMap<>();
        bodyTextTemplate.put("contentType", 1);
        bodyTextTemplate.put("text", "中秋快乐");
        Map<String, Object> contents = new HashMap<>();
        contents.put("contents", bodyTextTemplate);
        yd.setBodyTextTemplate(JSONUtil.toJsonStr(contents));

        yd.setSmsTemplate("中秋快乐");
        yd.setSubmit("true");

        String[] cDatas = new String[]{"^bodyTextTemplate", "^fallbackTemplate"};

        String ojbectToXmlWithCDATA = XmlGeneratorUtil.objectToXmlWithCDATA(YDCreateTemplateRequest.class, yd, cDatas);
        System.out.println(ojbectToXmlWithCDATA);
    }

5、参考

参考: https://javaee.github.io/jaxb-v2/doc JAXB 详解及实例分析