使用高性能xml序列化框架jibx作为spring mvc的xml view
package org.springframework.web.servlet.view.xml;
import java.io.ByteArrayOutputStream;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.stream.StreamResult;
import org.springframework.beans.BeansException;
import org.springframework.oxm.Marshaller;
import org.springframework.util.Assert;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.servlet.view.AbstractView;
public class XmlMarshallerView extends AbstractView {
/**
* Default content type. Overridable as bean property.
*/
public static final String DEFAULT_CONTENT_TYPE = "application/xml";
private Marshaller marshaller;
private JibxMarshallerFactory jibxMarshallerFactory;
private String modelKey;
/**
* Constructs a new {@code MarshallingView} with no {@link Marshaller} set. The marshaller must be set after
* construction by invoking {@link #setMarshaller(Marshaller)}.
*/
public XmlMarshallerView() {
setContentType(DEFAULT_CONTENT_TYPE);
setExposePathVariables(false);
}
/**
* Constructs a new {@code MarshallingView} with the given {@link Marshaller} set.
*/
public XmlMarshallerView(Marshaller marshaller) {
Assert.notNull(marshaller, "'marshaller' must not be null");
setContentType(DEFAULT_CONTENT_TYPE);
this.marshaller = marshaller;
setExposePathVariables(false);
}
public void setJibxMarshallerFactory(JibxMarshallerFactory jibxMarshallerFactory) {
this.jibxMarshallerFactory = jibxMarshallerFactory;
}
/**
* Sets the {@link Marshaller} to be used by this view.
*/
public void setMarshaller(Marshaller marshaller) {
Assert.notNull(marshaller, "'marshaller' must not be null");
this.marshaller = marshaller;
}
/**
* Set the name of the model key that represents the object to be marshalled. If not specified, the model map will be
* searched for a supported value type.
*
* @see Marshaller#supports(Class)
*/
public void setModelKey(String modelKey) {
this.modelKey = modelKey;
}
@Override
protected void initApplicationContext() throws BeansException {
if (marshaller == null && jibxMarshallerFactory == null) {
throw new RuntimeException("Property 'marshaller' or 'jibxMarshallerFactory', at least one is required");
}
}
@Override
protected void renderMergedOutputModel(Map<String, Object> model,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
Object toBeMarshalled = locateToBeMarshalled(model);
if (toBeMarshalled == null) {
throw new ServletException("Unable to locate object to be marshalled in model: " + model);
}
ByteArrayOutputStream bos = new ByteArrayOutputStream(2048);
marshaller.marshal(toBeMarshalled, new StreamResult(bos));
setResponseContentType(request, response);
response.setContentLength(bos.size());
FileCopyUtils.copy(bos.toByteArray(), response.getOutputStream());
}
/**
* Locates the object to be marshalled. The default implementation first attempts to look under the configured
* {@linkplain #setModelKey(String) model key}, if any, before attempting to locate an object of {@linkplain
* Marshaller#supports(Class) supported type}.
*
* @param model the model Map
* @return the Object to be marshalled (or {@code null} if none found)
* @throws ServletException if the model object specified by the {@linkplain #setModelKey(String) model key} is not
* supported by the marshaller
* @see #setModelKey(String)
*/
protected Object locateToBeMarshalled(Map<String, Object> model) throws ServletException {
if (this.modelKey != null) {
Object o = model.get(this.modelKey);
if (o == null) {
throw new ServletException("Model contains no object with key [" + modelKey + "]");
}
checkMarshaller(o);
if (!this.marshaller.supports(o.getClass())) {
throw new ServletException("Model object [" + o + "] retrieved via key [" + modelKey +
"] is not supported by the Marshaller");
}
return o;
}
for (Object o : model.values()) {
if (o != null) {
checkMarshaller(o);
if (this.marshaller.supports(o.getClass())) {
return o;
}
}
}
return null;
}
/**
* check the marshaller is null or not
* @param object if the marshaller is null, will query from jibxMarshallerFactory by object
*/
protected void checkMarshaller(Object object) {
if (marshaller == null) {
marshaller = jibxMarshallerFactory.getJibxMarshaller(object.getClass());
}
}
}
这个类参考了spring mvc的MarshallingView。不同就是引入了JibxMarshallerFactory。因为jibx 要对每个要序列化的类进行字节码增强。如果使用xstream等xml框架则不需要使用这个类。当然使用也是可以的。可以直接使用MarshallingView。
package com.vteba.service.xml.jibx;import java.util.HashMap;import java.util.List;import java.util.Map;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.InitializingBean;import org.springframework.oxm.jibx.JibxMarshaller;/**
* JibxMarshaller Factory。
* @author yinlei
* date 2013-8-1 下午8:10:45
*/publicclassJibxMarshallerFactoryimplementsInitializingBean{
privatestaticLogger logger =LoggerFactory.getLogger(JibxMarshallerFactory.class);
privatestaticfinalString BINDING_NAME ="Binding"; privateList<Class<?>> targetClassList;
privateMap<Class<?>,JibxMarshaller> jibxCache =newHashMap<Class<?>,JibxMarshaller>(); @Override
publicvoid afterPropertiesSet()throwsException{
if(targetClassList !=null){
for(Class<?> clazz : targetClassList){
JibxMarshaller jibxMarshaller =newJibxMarshaller();
jibxMarshaller.setTargetClass(clazz);
jibxMarshaller.setBindingName(BINDING_NAME);
jibxMarshaller.afterPropertiesSet();
jibxCache.put(clazz, jibxMarshaller);
}
}else{
if(logger.isInfoEnabled()){
logger.info("JiBX映射目标类没有设置。运行时将无法获得JibxMarshaller实例。");
}
}
} publicList<Class<?>> getTargetClassList(){
return targetClassList;
} publicvoid setTargetClassList(List<Class<?>> targetClassList){
this.targetClassList = targetClassList;
} publicJibxMarshaller getJibxMarshaller(Class<?> targetClass){
return jibxCache.get(targetClass);
}}
因为jibx对所有需要序列化的JavaBean都要事先注册,所以你要事先配置JibxMarshallerFactory,将所有要序列化的类都配置进去。
例如:
<beanid="jibxMarshallerFactory"class="com.vteba.service.xml.jibx.JibxMarshallerFactory">
<propertyname="targetClassList">
<list>
<value>com.vteba.service.xml.jibx.Customer</value>
</list>
</property>
</bean>
绝对原创,转载请注明出处。
最新文章
- Golang 编写的图片压缩程序,质量、尺寸压缩,批量、单张压缩
- IE8下获取iframe document EVENT对象的问题
- Spring基础—— 泛型依赖注入
- [改善Java代码]使用package-info类为包服务
- Apache ‘mod_pagespeed’模块跨站脚本漏洞
- WebLogic12c 注册windows系统服务
- FPGA那些事 --经典总结
- fancyBox简单入门
- N个骰子的点数和的概率分布
- Hadoop中MapReduce作业流程图
- JDK并发包常用的知识图
- Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(五)
- 在Salesforce成长:需要好奇心
- vue 验证码倒计时
- 国外(英文)——WPF较好的奇葩问题解决网站
- Spring控制反转(依赖注入)的最简单说明
- 002.NFS相关配置项
- 010-jdk1.8版本新特性二-Optional类,Stream流
- C++:构造函数3——浅拷贝和深拷贝
- 题解 P1334 【瑞瑞的木板】
热门文章
- Qt之HTTP上传/下载(继承QNetworkAccessManager,包括使用了authenticationRequired认证信号)
- 认识IL代码---从开始到现在 <;第二篇>;
- 【MVC4 之 ViewData ViewBag TempData】
- You don&#39;t seem to have &#39;make&#39; or &#39;gmake&#39; in your PATH
- Headroom.js
- 百度地图JavaScript API V1.5初级开发工具类
- java_IO流之 NIO
- PL/SQL Developer 如何显示行号
- 浅谈ThreadPool 线程池
- QUARTZ CRON