JAXB的CDATA节点处理
JAXB的CDATA节点处理
海岸Thirty 发表于7个月前
JAXB的CDATA节点处理
  • 发表于 7个月前
  • 阅读 41
  • 收藏 0
  • 点赞 0
  • 评论 0
摘要: 不晓得为什么JAXB标准里竟然没有CDATA的注解,有点怀念公司那个破框架了。网上看了下主要的处理方式,最后选择了eclipselink。

JAXB的CDATA节点,参考了很多网上的博文,主要有:

1、通过@XmlJavaTypeAdapter,主要由于转义被省略了,放弃。

http://zhaoyx.iteye.com/blog/1856259

2、借助SunAPI版本编写XMLSerializer,这种蛮好的,但是我的Maven编译不下去

http://blog.csdn.net/wantken/article/details/50675549

     这位介绍了两种,第二种好长。。。。

3、似乎还有一种用XStream,先看了下性能比较就没尝试了(1C 1G的小水管伤不起)

http://www.cnblogs.com/tang9139/p/4825610.html

4、还有一种使用apache的OutputFormat,感觉不是很灵活,没去尝试

http://blog.csdn.net/u010648555/article/details/51681695

5、最后采用eclipselink的

第一步:修改pom.xml增加eclipselink依赖

看到最新的2.6.3了

<dependency>
	<groupId>org.eclipse.persistence</groupId>
	<artifactId>org.eclipse.persistence.moxy</artifactId>
	<version>2.6.3</version>
</dependency>

如果使用maven打包,build->resources节点要修改下,否则后面的jaxb.properties打不进去

<resources>
	<resource>
		<directory>src/main/java</directory>
		<includes>
            <!-- 不加这个java目录下的properties不会打进war包 -->
			<include>**/*.properties</include>
		</includes>
	</resource>
    <!-- 上面的改完后不加这个,resources目录下的内容打不进war包了,烦躁啊...我传了两个版本 -->
	<resource>
		<directory>src/main/resources</directory>
	</resource>
</resources>

第二步:在bean的同级目录增加jaxb.properties文件

 

 

 

 

文件内容:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

 

第三步:增加@XmlCDATA注解咯

package pub.thirty.tbk.module.wx.domain.xml;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import org.eclipse.persistence.oxm.annotations.XmlCDATA;



@XmlRootElement(name="xml")
// 这里不自动映射了,默认的映射会去找public,注解在field上就冲突了,要报错的哟
@XmlAccessorType(XmlAccessType.NONE)
public class WXMessage {
	
	@XmlElement(name="ToUserName")
	@XmlCDATA
	String toUserName;
	@XmlElement(name="Encrypt")
	@XmlCDATA
	String encrypt;
	@XmlElement(name="FromUserName")
	@XmlCDATA
	String fromUserName;
	@XmlElement(name="CreateTime")
	Long createTime;
	@XmlElement(name="MsgType")
	@XmlCDATA
	String msgType;
	@XmlElement(name="Content")
	@XmlCDATA
	String content;
	@XmlElement(name="MsgId")
	String msgId;
	// 返回签名
	@XmlElement(name="MsgSignature")
	@XmlCDATA
	String msgSignature;
	// 返回时间戳
	@XmlElement(name="TimeStamp")
	String timeStamp;
	@XmlElement(name="Nonce")
	String nonce;

    /*** getter and setter ***/
}

 

其他一些:

   省略掉xml头(有人说叫序言),就是<?xml version="1.0" encoding="UTF-8"?>这段咯

@Bean
public Jaxb2Marshaller jaxb2Marshaller(){
	Jaxb2Marshaller bean = new Jaxb2Marshaller();
	bean.setClassesToBeBound(
		WXMessage.class
	);
	Map<String,Object> props = new HashMap<>();
	props.put(Marshaller.JAXB_FORMATTED_OUTPUT, true);
	props.put(Marshaller.JAXB_FRAGMENT, true);
    //如果是Marshaller对象用下面的,我这里时丢给spring viewResolver的
	//bean.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
	bean.setMarshallerProperties(props);
	return bean;
}

 

效果:

<xml>
	<ToUserName><![CDATA[22222222]]></ToUserName>
	<FromUserName><![CDATA[1111111]]></FromUserName>
	<CreateTime>1491718078829</CreateTime>
	<MsgType><![CDATA[text]]></MsgType>
	<Content><![CDATA[您可以回复以下内容]]></Content>
</xml> 

 

PS:第一次写,感觉码云这个页面风格挺喜欢的。8错

 

标签: JAXB XML CData
共有 人打赏支持
粉丝 4
博文 9
码字总数 4485
×
海岸Thirty
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: