- Introduction
- Quick Start
- Design
- Tutorial
- Spring MVC
- JSP/JSTL/Servlet
- JQuery and plugins
- Ajax
- Twitter Bootstrap CSS
- SiteMesh
- YUICompressor
- Spring Restful Service
- JAX-WS/CXF
- Spring Data JPA
- JPA/Hibernate
- MyBatis
- Database
- H2 Database
- Datasource
- Transaction
- Redis
- Cache Overview
- Guava Cache
- Ehcache
- Memcached
- Shiro Security
- Crypto
- Schedule/Quartz
- Jmx
- System Protection
- Hystrix
- Rate Limiter
- Monitoring and Metrics
- Metrics-library
- Graphite
- Logging/Slf4j/Logback
- Logstash
- Spring
- Validation Overview
- JQuery Validation
- Hibernate Validator
- General Utilizes
- JSON/JAXB
- Date
- Test Overview
- Unit Test/Mockito/AssertJ
- Selenium2
- BDD
- Performace-test
- JMeter
- Profiler
- Simulator Overview
- Nodejs
- Eclipse
- Maven
- Sonar
- git
- Travis CI
- Jetty
- Micro-Service Architecture/Executable War
- AssertJ
- CreateNewProject
- Dozer
- Graphite-Windows
- Hello-Everybody
- Jaxb
- Json
- Mock
Jaxb
Overview
JAXB的非官方文档: http://jaxb.java.net/guide/
SpringSide-Core中的JaxbMapper
Jaxb中最讨厌的地方,是需要在构造JAXBContext时,预先设定可能会处理的Root Element Types。 Springside参考Spring里的做法,封装类一个静态的Map,为每一个Class维护了一个JaxbContext,这样子就仍然可以以静态函数的方式调用Mapper了。
第二麻烦就是处理顶级对象是个Collection,而不是POJO的场景。 JAXBMapper专门提供了如下的toXML函数,使用了一个注释了@XmlAnyElement的Wrapper来实现。
String toXml(Collection<?> root, String rootName)
另外JAXBContext是线程安全的可任意重用。Marshaller和Unmarshaller则是线程不安全的,需要每次创建。如果性能很苛刻,可以对Unmarshaller对象进行Pooling,保证每次只被一条线程调用,但使用后不会销毁而是放回池里。
SpringSide showcase中的JaxbDemo
Jaxb目录下的User对象演示了几种典型的Jaxb Annotation, 包括@XmlAttribute, @XmlTransient, @XmlType(propOrder = {...})
还有另一个常用的配置是将Collection属性输出成大家一般期望的样子。 比如:
@XmlElementWrapper
@XmlElement(name = "role")
public List<Role> getRoles() {
return roles;
}
必须要这样以后, 输出才是大家一般期望样子,这是JAXB第三个傻的地方。
<roles><role id="1" name="admin"/></roles>
最后,还演示了Map序列化到下面的样子,这是最高境界了,使用了@XmlJavaTypeAdapter 和 一个自己写的HouseMapAdapter。这么复杂的情况,再让我写一次出来都不一定能行。 建议还是懒一点,按默认输出,难看就难看一点了。
<houses>
<house key="bj">house1</item>
<hosue key="gz">house2</item>
</houses>
默认输出是这样子的:
<map>
<entry>
<key>a</key>
<value>1</value>
</entry>
<entry>
<key>b</key>
<value>2</value>
</entry>
</map>
文档里的有用Tips
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论