spring oxm xstream-oxm 干什么用

07点睛Spring MVC4.1-ContentNegotiatingViewResolver - 汪云飞记录本 - ITeye技术网站
博客分类:
7.1 ContentNegotiatingViewResolver
ContentNegotiatingViewResolver支持在Spring MVC下输出不同的格式;
ContentNegotiatingViewResolver是ViewResolver的一个实现;
ContentNegotiatingViewResolver使用request的媒体类型,根据扩展名选择不同的view输出不同的格式;
ContentNegotiatingViewResolver不是自己处理view,而是代理给不同的ViewResolver来处理不同的
本例演示根据扩展名获得不同的页面;
view:WEB-INF/views/demoObj.jsp
viewResolver:UrlBasedViewResolver或InternalResourceViewResolver
view:PdfView
viewResolver:PdfViewResolver
view:MappingJackson2JsonView
viewResolver:JsonViewResolver
view:MarshallingView
viewResolver:XmlViewResolver
view:XlsView
viewResolver:XlsViewResolver
7.2.1 添加依赖
json依赖03点睛Spring MVC 4.1-REST已添加
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-oxm&/artifactId&
&version&${spring-framework.version}&/version&
&/dependency&
&dependency&
&groupId&com.lowagie&/groupId&
&artifactId&itext&/artifactId&
&version&4.2.1&/version&
&/dependency&
&dependency&
&groupId&org.apache.poi&/groupId&
&artifactId&poi&/artifactId&
&version&3.10-beta2&/version&
&/dependency&
7.2.2 定制view和viewResolve
7.2.2.1 pdf
7.2.2.1.1 view
package com.wisely.view;
import java.awt.Color;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.view.document.AbstractPdfView;
import com.lowagie.text.Document;
import com.lowagie.text.Element;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;
import com.wisely.domain.DemoObj;
public class PdfView extends AbstractPdfView {
protected void buildPdfDocument(Map&String, Object& model,
Document document, PdfWriter writer, HttpServletRequest request,
HttpServletResponse response) throws Exception {
DemoObj demoObj = (DemoObj) model.get("demoObj");
PdfPTable table = new PdfPTable(2);
table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
table.getDefaultCell().setVerticalAlignment(Element.ALIGN_MIDDLE);
table.getDefaultCell().setBackgroundColor(Color.lightGray);
table.addCell("ID");
table.addCell("NAME");
table.addCell(demoObj.getId().toString());
table.addCell(demoObj.getName());
document.add(table);
7.2.2.1.2 viewResolver
package com.wisely.viewresolver;
import java.util.Locale;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;
import com.wisely.view.PdfView;
public class PdfViewResolver implements ViewResolver{
public View resolveViewName(String viewName, Locale locale)
throws Exception {
return new PdfView();
7.2.2.2 xls
7.2.2.2.1 view
package com.wisely.view;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.springframework.web.servlet.view.document.AbstractExcelView;
import com.wisely.domain.DemoObj;
public class XlsView extends AbstractExcelView{
protected void buildExcelDocument(Map&String, Object& model,
HSSFWorkbook workbook, HttpServletRequest request,
HttpServletResponse response) throws Exception {
DemoObj demoObj = (DemoObj) model.get("demoObj");
Sheet sheet = workbook.createSheet("sheet1");
CellStyle style = workbook.createCellStyle();
style.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.index);
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
style.setAlignment(CellStyle.ALIGN_CENTER);
Row row = null;
Cell cell = null;
int rowCount = 0;
int colCount = 0;
// 创建头部
row = sheet.createRow(rowCount++);
cell = row.createCell(colCount++);
cell.setCellStyle(style);
cell.setCellValue("ID");
cell = row.createCell(colCount++);
cell.setCellStyle(style);
cell.setCellValue("NAME");
// 创建数据
row = sheet.createRow(rowCount++);
colCount = 0;
row.createCell(colCount++).setCellValue(demoObj.getId());
row.createCell(colCount++).setCellValue(demoObj.getName());
for (int i = 0; i & 3; i++)
sheet.autoSizeColumn(i, true);
7.2.2.2.2 viewResolver
package com.wisely.viewresolver;
import java.util.Locale;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;
import com.wisely.view.XlsView;
public class XlsViewResolver implements ViewResolver{
public View resolveViewName(String viewName, Locale locale)
throws Exception {
return new XlsView();
7.2.2.3 json
7.2.2.3.1 view
使用的是MappingJackson2JsonView
7.2.2.3.2 viewResolver
package com.wisely.viewresolver;
import java.util.Locale;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
public class JsonViewResolver implements ViewResolver{
public View resolveViewName(String viewName, Locale locale)
throws Exception {
MappingJackson2JsonView view = new MappingJackson2JsonView();
view.setPrettyPrint(true);
7.2.2.4 xml
7.2.2.4.1 DemoBean的额外配置
package com.wisely.domain;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "demo")
public class DemoObj {
private Long
private String
public DemoObj() {
public DemoObj(Long id, String name) {
this.name =
public Long getId() {
@XmlElement
public void setId(Long id) {
public String getName() {
@XmlElement
public void setName(String name) {
this.name =
7.2.2.4.2 view
使用的是MarshallingView
7.2.2.4.3 viewResolver
package com.wisely.viewresolver;
import java.util.Locale;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.view.xml.MarshallingView;
import com.wisely.domain.DemoObj;
public class XmlViewResolver implements ViewResolver {
public View resolveViewName(String viewName, Locale locale)
throws Exception {
MarshallingView view = new MarshallingView();
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setClassesToBeBound(DemoObj.class);
marshaller.setPackagesToScan("com.wisely.domain");
view.setMarshaller(marshaller);
7.2.2.5 jsp
7.2.2.5.1 view
WEB-INF/views/demoObj.jsp
&%@ taglib uri="/jsp/jstl/core" prefix="c" %&
&%@ page language="java" contentType="text/ charset=UTF-8"
pageEncoding="UTF-8"%&
&!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&
&meta http-equiv="Content-Type" content="text/ charset=UTF-8"&
&title&Insert title here&/title&
id/name &br/&
${demoObj.id}/${demoObj.name}
7.2.2.5.2 viewResolver
UrlBasedViewResolver或InternalResourceViewResolver
7.2.3 配置resolver
package com.wisely;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.ponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.accept.ContentNegotiationManager;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.monsMultipartResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;
import org.springframework.web.servlet.view.JstlView;
import org.springframework.web.servlet.view.UrlBasedViewResolver;
import com.wisely.interceptors.DemoInteceptor;
import com.wisely.viewresolver.JsonViewResolver;
import com.wisely.viewresolver.PdfViewResolver;
import com.wisely.viewresolver.XlsViewResolver;
import com.wisely.viewresolver.XmlViewResolver;
@Configuration
@ComponentScan("com.wisely")
@EnableWebMvc
public class DemoMVCConfig extends WebMvcConfigurerAdapter {
//在此---jsp viewResolver
public UrlBasedViewResolver viewResolver() {
UrlBasedViewResolver resolver = new UrlBasedViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setViewClass(JstlView.class);
// 注册自定义拦截器
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(demoInteceptor());
// 自定义拦截器
public DemoInteceptor demoInteceptor() {
return new DemoInteceptor();
// 静态资源映射
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
// 文件上传设置
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(1000000);
return multipartR
// 在此---配置ContentNegotiationManager,在无后缀名情况下默认为jsp view resolver
public void configureContentNegotiation(
ContentNegotiationConfigurer configurer) {
configurer.ignoreAcceptHeader(true).defaultContentType(
MediaType.TEXT_HTML);
// 在此---配置ContentNegotiatingViewResolver,通过此代理到不同的viewResolover
public ViewResolver contentNegotiatingViewResolver(
ContentNegotiationManager manager) {
ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();
resolver.setContentNegotiationManager(manager);
List&ViewResolver& resolvers = new ArrayList&ViewResolver&();
resolvers.add(xmlViewResolver());
resolvers.add(jsonViewResolver());
resolvers.add(viewResolver());// jsp view resolver
resolvers.add(pdfViewResolver());
resolvers.add(xlsViewResolver());
resolver.setViewResolvers(resolvers);
//在此---xml viewResolver
public ViewResolver xmlViewResolver() {
return new XmlViewResolver();
//在此---json viewResolver
public ViewResolver jsonViewResolver() {
return new JsonViewResolver();
//在此---pdf viewResolver
public ViewResolver pdfViewResolver() {
return new PdfViewResolver();
//在此---excel viewResolver
ViewResolver xlsViewResolver() {
return new XlsViewResolver();
7.2.4 演示控制器
package com.wisely.web;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.wisely.domain.DemoObj;
@Controller
public class ContentController {
@RequestMapping(value = "/getdemo",method = RequestMethod.GET)
public String getDemo(Model model){
DemoObj demoObj = new DemoObj(333l, "WYF");
model.addAttribute("demoObj",demoObj);
return "demoObj";
7.2.5 结果
7.2.5.1 jsp
7.2.5.2 json
7.2.5.3 pdf
7.2.5.4 xml
7.2.5.5 xls
新书推荐《JavaEE开发的颠覆者: Spring Boot实战》,涵盖Spring 4.x、Spring MVC 4.x、Spring Boot企业开发实战。
京东地址:
当当地址:
亚马逊地址:
或自己在京东、淘宝、亚马逊、当当、互动出版社搜索自选。
pdf和xls还都是调用浏览器本地插件显示的吧另外DemoObj demoObj = new DemoObj(333l, "WYF");这句应该改成“DemoObj demoObj = new DemoObj(333, "WYF")”;吧?DemoObj的id是long型的,所以加了l
浏览: 710916 次
来自: 合肥
浏览量:35975
浏览量:55810
荆人七十 写道如果我有一个配置类和多个格式相同内容不同的配置文 ...
荆人七十 写道如果我有一个配置类和多个格式相同内容不同的配置文 ...
博主,下载源码的链接不能用了
反映一个错误:148页,“6.3日志配置”小节中,“配置日志级 ...
我安装后出现Failed Units :1
user-clo ...阅读(3271)
一. 简介:
xStream可以轻易的将Java对象转换成xml、JSON。本篇博客将使用springMVC整合利用xStream转换xml。
关于xStream使用的博文:http://blog.csdn.net/zdp072/article/details/
二. 实例:
1. 代码结构图:
2. 实体类:
(1)Account
public class Account {
// getter and setter
public String toString() {
return this.name + &#& + this.id + &#& + this.address + &#& + this.birthday + &#& + this.
public class User {
// getter and setter
public String toString() {
return this.name + &#& + this.age + &#& + this.sex + &#& + this.address + &#& + this.birthday.getBirthday();
(3)Birthday
public class Birthday {
public Birthday() {
// getter and setter
3. spring配置:
&?xml version=&1.0& encoding=&UTF-8&?&
&beans xmlns=&http://www.springframework.org/schema/beans&
xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
xmlns:context=&http://www.springframework.org/schema/context&
xmlns:mvc=&http://www.springframework.org/schema/mvc&
xsi:schemaLocation=&http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd&&
&!-- 添加注解驱动 --&
&mvc:annotation-driven /&
&!-- 默认扫描的包路径 --&
&context:component-scan base-package=&com.zdp& /&
&!-- 视图解析器 --&
&bean class=&org.springframework.web.servlet.view.BeanNameViewResolver&&
&property name=&order& value=&1& /&
&bean class=&org.springframework.web.servlet.view.InternalResourceViewResolver&&
&property name=&viewClass& value=&org.springframework.web.servlet.view.JstlView& /&
&!-- xml视图,XStreamMarshaller,可以转换任何形式的java对象 --&
&bean name=&xStreamMarshallingView& class=&org.springframework.web.servlet.view.xml.MarshallingView&&
&property name=&marshaller&&
&bean class=&org.springframework.oxm.xstream.XStreamMarshaller&&
&!-- 启用annotation --&
&property name=&autodetectAnnotations& value=&true& /&
&!-- 类名别名 --&
&property name=&aliases&&
&!-- Account这个类的别名就变成了myBeans,那么转换后的xml中就是myBeans --&
&entry key=&myBeans& value=&com.zdp.domain.Account& /&
&/property&
&!-- 基本属性别名 --&
&property name=&fieldAliases&&
&!-- Account中的brithday这个属性 --&
&entry key=&com.zdp.domain.Account.birthday& value=&birthday& /&
&/property&
&/property&
4. XstreamController
* 利用xStream进行Java对象到XML的转换技术
@Controller
@RequestMapping(&/xstream/view&)
public class XStreamController {
// 普通JavaBean转换成XML
// url: http://localhost:8080/springmvc_xStream/xstream/view/doXMLXstream
@RequestMapping(&/doXMLXstream&)
public ModelAndView doXMLJaxb2View() {
ModelAndView mav = new ModelAndView(&xStreamMarshallingView&);
Account account = new Account();
account.setAddress(&address&);
account.setEmail(&email&);
account.setId(1);
account.setName(&haha&);
Birthday day = new Birthday();
day.setBirthday(&&);
account.setBirthday(day);
mav.addObject(BindingResult.MODEL_KEY_PREFIX, account);
// 转换带List属性的JavaBean
// url: http://localhost:8080/springmvc_xStream/xstream/view/doListXMLXstream
@RequestMapping(&/doListXMLXstream&)
public ModelAndView doListXMLXStreamView() {
ModelAndView mav = new ModelAndView(&xStreamMarshallingView&);
List&Object& list = new ArrayList&Object&();
for (int i = 0; i & 3; i++) {
Account account = new Account();
account.setAddress(&北京#& + i);
account.setEmail(&email& + i + &@12& + i + &.com&);
account.setId(1 + i);
account.setName(&haha#& + i);
Birthday birthday = new Birthday();
birthday.setBirthday(&& + i);
account.setBirthday(birthday);
list.add(account);
User user = new User();
user.setAddress(&china GuangZhou 广州# & + i);
user.setAge(23 + i);
user.setBirthday(birthday);
user.setName(&jack#& + i);
user.setSex(Boolean.parseBoolean(i + &&));
list.add(user);
mav.addObject(list);
// 转换带有Map属性的JavaBean
// url: http://localhost:8080/springmvc_xStream/xstream/view/doMapXMLXstream
@RequestMapping(&/doMapXMLXstream&)
public ModelAndView doDifferXMLXStreamView() {
ModelAndView mav = new ModelAndView(&xStreamMarshallingView&);
Account account = new Account();
account.setAddress(&广东&);
account.setEmail(&email&);
account.setId(1);
account.setName(&haha&);
Birthday birthday = new Birthday();
birthday.setBirthday(&&);
account.setBirthday(birthday);
User user = new User();
user.setAddress(&china GuangZhou&);
user.setAge(23);
user.setBirthday(birthday);
user.setName(&jack&);
user.setSex(true);
Map&String, Object& map = new HashMap&String, Object&();
map.put(&account&, account);
map.put(&user&, user);
mav.addObject(map);
// 转换数组
// url: http://localhost:8080/springmvc_xStream/xstream/view/doArrayXMLXstream
@RequestMapping(&/doArrayXMLXstream&)
public ModelAndView doArrayXMLXStreamView() {
ModelAndView mav = new ModelAndView(&xStreamMarshallingView&);
Account[] accountArr = new Account[2];
Account account = new Account();
account.setAddress(&北京&);
account.setEmail(&email&);
account.setId(1);
account.setName(&haha&);
Birthday birthday = new Birthday();
birthday.setBirthday(&&);
account.setBirthday(birthday);
accountArr[0] =
account = new Account();
account.setAddress(&上海&);
account.setEmail(&email&);
account.setId(1);
account.setName(&haha&);
birthday = new Birthday();
birthday.setBirthday(&&);
account.setBirthday(birthday);
accountArr[1] =
mav.addObject(accountArr);
源码下载:http://download.csdn.net/detail/zdp072/7866271
原文:http://blog.csdn.net/ibm_hoojo/article/details/6371647
阅读排行榜ClassNotFoundException-org-springframework-oxm-jaxb-Jaxb2Marshaller下次自动登录
现在的位置:
& 综合 & 正文
Spring3:如何配置ContentNegotiatingViewResolver返回JSON或者XML格式数据?
首先,我们回顾下,在基于Spring的RESTful的项目中如果你使用这种形式的URL:
http://localhost:8888/myapp/service/xxx/{id}
那么一般情况下,你会被导向到一个HTML页面。如果你想让它返回一个JSON格式或者XML格式的数据,那么你不得不在前台做一番格式转换的处理。
现在,你只需要在你的spring-servlet.xml文件里面配置一下就可以了。
先看配置:
&?xml version="1.0" encoding="UTF-8"?&
&beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"&
&context:component-scan base-package="com.homeland.myapp.controller" /&
&mvc:annotation-driven /&
&mvc:resources location="/images/" mapping="/images/**" /&
&mvc:resources location="/js/" mapping="/js/**" /&
&mvc:resources location="/css/" mapping="/css/**" /&
&bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"&
&property name="order" value="1" /&
&property name="favorParameter" value="false" /&
&property name="ignoreAcceptHeader" value="true" /&
&property name="defaultContentType" value="text/html" /&
&property name="mediaTypes"&
&entry key="json" value="application/json" /&
&entry key="xml" value="application/xml" /&
&/property&
&property name="viewResolvers"&
class="org.springframework.web.servlet.view.BeanNameViewResolver" /&
class="org.springframework.web.servlet.view.InternalResourceViewResolver"&
&property name="prefix" value="/page/" /&
&property name="suffix" value=".jsp" /&
&/property&
&property name="defaultViews"&
&bean id="jsonView"
class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /&
&bean id="xmlView"
class="org.springframework.web.servlet.view.xml.MarshallingView"&
&constructor-arg&
&bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller"&
&property name="classesToBeBound"&
&value&com.homeland.myapp.entity.Employee&/value&
&/property&
&/constructor-arg&
&/property&
21行:viewResolver的顺序
22行:是一个格式化的开关,类似http://localhost:8888/myapp/service/{id}?format=json这种
23行:忽略请求头中的Accept
25行:默认的数据返回格式
26行~31行:配置媒体类型与扩展名的映射关系,也即将Content-Type=application/json的内容映射到http://localhost:8888/myapp/service/{id}.json这种格式
32行~42行:配置你的ViewResolver
42行~60行:配置数据格式的转换器
数据格式的转换器部分,需要说的是,在spring的包里面有2个不同的类:
org.springframework.web.servlet.view.json.MappingJacksonJsonView
org.springframework.web.servlet.view.json.MappingJackson2JsonView
这两个类对应到pom.xml文件是不同的包,先说第一个:
用第一个类你的JSON解析器是这样的:
&dependency&
&groupId&org.codehaus.jackson&/groupId&
&artifactId&jackson-core-asl&/artifactId&
&version&1.9.13&/version&
&/dependency&
&dependency&
&groupId&org.codehaus.jackson&/groupId&
&artifactId&jackson-mapper-asl&/artifactId&
&version&1.9.13&/version&
&/dependency&
&dependency&
&groupId&org.codehaus.jackson&/groupId&
&artifactId&jackson-jaxrs&/artifactId&
&version&1.9.13&/version&
&/dependency&
用第二个类你的JSON解析器是这样的:
&dependency&
&groupId&com.fasterxml.jackson.core&/groupId&
&artifactId&jackson-core&/artifactId&
&version&2.2.2&/version&
&/dependency&
&dependency&
&groupId&com.fasterxml.jackson.core&/groupId&
&artifactId&jackson-databind&/artifactId&
&version&2.2.2&/version&
&/dependency&
&dependency&
&groupId&com.fasterxml.jackson.core&/groupId&
&artifactId&jackson-annotations&/artifactId&
&version&2.2.2&/version&
&/dependency&
此外,我配置的XML解析器是:
org.springframework.oxm.jaxb.Jaxb2Marshaller
如果你使用JAXB来绑定,那么你的entity类的annotation是这样的:
package com.homeland.myapp.
import java.io.S
import javax.persistence.C
import javax.persistence.E
import javax.persistence.GeneratedV
import javax.persistence.GenerationT
import javax.persistence.Id;
import javax.persistence.SequenceG
import javax.persistence.T
import javax.xml.bind.annotation.XmlE
import javax.xml.bind.annotation.XmlRootE
@Table(name = "employee")
@XmlRootElement(name = "employee")
public class Employee implements Serializable {
private static final long serialVersionUID = -6785130L;
@SequenceGenerator(name = "seq_employee_id",
allocationSize = 1, initialValue = 1,
sequenceName = "seq_employee_id")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_employee_id")
@Column(name = "first_name", length = 60, nullable = false)
@Column(name = "last_name", length = 60, nullable = false)
@Column(name = "full_name", length = 120, nullable = false)
@Column(name = "age", length = 3, nullable = false)
@Column(name = "sex", length = 1, nullable = false)
@Column(name = "email", length = 255, nullable = false)
@Column(name = "cell_phone", length = 15, nullable = false)
@Column(name = "department_id", nullable = false)
private int
departmentId;
@Column(name = "role_id", nullable = false)
private int roleId;
public Employee() {}
public int getId() {
@XmlElement
public void setId(int id) {
public String getFirstname() {
@XmlElement
public void setFirstname(String firstname) {
this.firstname =
public String getLastname() {
@XmlElement
public void setLastname(String lastname) {
this.lastname =
public String getFullname() {
@XmlElement
public void setFullname(String fullname) {
this.fullname =
public int getAge() {
@XmlElement
public void setAge(int age) {
this.age =
public int isSex() {
@XmlElement
public void setSex(int sex) {
this.sex =
public int getSex() {
public String getEmail() {
@XmlElement
public void setEmail(String email) {
this.email =
public String getCellphone() {
@XmlElement
public void setCellphone(String cellphone) {
this.cellphone =
public int getDepartmentId() {
return departmentId;
@XmlElement
public void setDepartmentId(int departmentId) {
this.departmentId = departmentId;
public int getRoleId() {
return roleId;
@XmlElement
public void setRoleId(int roleId) {
this.roleId = roleId;
这里必须要说一下,如果你把@XmlElement放在property上面,会报错。这个很莫名其妙。根据错误信息,它判定有两个同名的属性,我猜测是因为在扫描文件的时候把方法也扫了。不知道为啥。所以,就把@XmlElement放在了setter()方法上。
但是,我们知道还有另外一个很好用的就是XStream解析器。
那么,如何使用XStream的话,配置文件要如何改呢?
&?xml version="1.0" encoding="UTF-8"?&
&beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"&
&context:component-scan base-package="com.homeland.myapp.controller" /&
&mvc:annotation-driven /&
&mvc:resources location="/images/" mapping="/images/**" /&
&mvc:resources location="/js/" mapping="/js/**" /&
&mvc:resources location="/css/" mapping="/css/**" /&
&bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"&
&property name="order" value="1" /&
&property name="favorParameter" value="false" /&
&property name="ignoreAcceptHeader" value="true" /&
&property name="defaultContentType" value="text/html" /&
&property name="mediaTypes"&
&entry key="json" value="application/json" /&
&entry key="xml" value="application/xml" /&
&/property&
&property name="viewResolvers"&
class="org.springframework.web.servlet.view.BeanNameViewResolver" /&
class="org.springframework.web.servlet.view.InternalResourceViewResolver"&
&property name="prefix" value="/page/" /&
&property name="suffix" value=".jsp" /&
&/property&
&property name="defaultViews"&
&bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /&
&bean id="xmlView" class="org.springframework.web.servlet.view.xml.MarshallingView"&
&property name="marshaller"&
&bean class="org.springframework.oxm.xstream.XStreamMarshaller"/&
&/property&
&/property&
相对应的entity类的annotation也要改:
package com.homeland.myapp.
import java.io.S
import javax.persistence.C
import javax.persistence.E
import javax.persistence.GeneratedV
import javax.persistence.GenerationT
import javax.persistence.Id;
import javax.persistence.SequenceG
import javax.persistence.T
import com.thoughtworks.xstream.annotations.XStreamA
import com.thoughtworks.xstream.annotations.XStreamAsA
@Table(name = "employee")
@XStreamAlias("employee")
public class Employee implements Serializable {
private static final long serialVersionUID = -6785130L;
@SequenceGenerator(name = "seq_employee_id",
allocationSize = 1, initialValue = 1,
sequenceName = "seq_employee_id")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_employee_id")
@XStreamAsAttribute
@XStreamAlias("id")
@Column(name = "first_name", length = 60, nullable = false)
@XStreamAsAttribute
@XStreamAlias("first_name")
@Column(name = "last_name", length = 60, nullable = false)
@XStreamAsAttribute
@XStreamAlias("last_name")
@Column(name = "full_name", length = 120, nullable = false)
@XStreamAsAttribute
@XStreamAlias("full_name")
@Column(name = "age", length = 3, nullable = false)
@XStreamAsAttribute
@XStreamAlias("age")
@Column(name = "sex", length = 1, nullable = false)
@XStreamAsAttribute
@XStreamAlias("sex")
@Column(name = "email", length = 255, nullable = false)
@XStreamAsAttribute
@XStreamAlias("email")
@Column(name = "cell_phone", length = 15, nullable = false)
@XStreamAsAttribute
@XStreamAlias("cell_phone")
@Column(name = "department_id", nullable = false)
@XStreamAsAttribute
@XStreamAlias("department_id")
private int
departmentId;
@Column(name = "role_id", nullable = false)
@XStreamAsAttribute
@XStreamAlias("role_id")
private int roleId;
public Employee() {}
public int getId() {
public void setId(int id) {
public String getFirstname() {
public void setFirstname(String firstname) {
this.firstname =
public String getLastname() {
public void setLastname(String lastname) {
this.lastname =
public String getFullname() {
public void setFullname(String fullname) {
this.fullname =
public int getAge() {
public void setAge(int age) {
this.age =
public int isSex() {
public void setSex(int sex) {
this.sex =
public int getSex() {
public String getEmail() {
public void setEmail(String email) {
this.email =
public String getCellphone() {
public void setCellphone(String cellphone) {
this.cellphone =
public int getDepartmentId() {
return departmentId;
public void setDepartmentId(int departmentId) {
this.departmentId = departmentId;
public int getRoleId() {
return roleId;
public void setRoleId(int roleId) {
this.roleId = roleId;
不过,用JAXB以及XStream其返回的数据样式也不完全一样。大家可以比较一下。
在使用Spring3自带的XStreamMarshaller的时候,你会发现如果你用了下划线("_")来链接属性名中的两个或多个单词的话,在最终的xml返回值中出现了双下划线("__")。
目前还不知道怎么解决。网上搜索了下,貌似要换marshaller了。当然,你也可以不用。以下告诉你,用好@XStreamAliases会让返回的XML好看一些:
&?xml version="1.0" encoding="UTF-8"?&
&beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"&
&context:component-scan base-package="com.homeland.myapp.controller" /&
&mvc:annotation-driven /&
&mvc:resources location="/images/" mapping="/images/**" /&
&mvc:resources location="/js/" mapping="/js/**" /&
&mvc:resources location="/css/" mapping="/css/**" /&
&bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"&
&property name="order" value="1" /&
&property name="favorParameter" value="false" /&
&property name="ignoreAcceptHeader" value="true" /&
&property name="defaultContentType" value="text/html" /&
&property name="mediaTypes"&
&entry key="json" value="application/json" /&
&entry key="xml" value="application/xml" /&
&/property&
&property name="viewResolvers"&
class="org.springframework.web.servlet.view.BeanNameViewResolver" /&
class="org.springframework.web.servlet.view.InternalResourceViewResolver"&
&property name="prefix" value="/page/" /&
&property name="suffix" value=".jsp" /&
&/property&
&property name="defaultViews"&
&bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /&
&bean id="xmlView" class="org.springframework.web.servlet.view.xml.MarshallingView"&
&property name="marshaller"&
&bean class="org.springframework.oxm.xstream.XStreamMarshaller"&
&property name="autodetectAnnotations" value="true" /&
&!-- &property name="aliases"&
&entry key="employee" value="com.homeland.myapp.entity.Employee" /&
&/property&
&property name="fieldAliases"&
&entry key="com.homeland.myapp.entity.Employee.firstname" value="first_name" /&
&/property& --&
&/property&
&/property&
在上面代码中注释部分相当于加了annotation的entity类:
package com.homeland.myapp.
import java.io.S
import javax.persistence.C
import javax.persistence.E
import javax.persistence.GeneratedV
import javax.persistence.GenerationT
import javax.persistence.Id;
import javax.persistence.SequenceG
import javax.persistence.T
import com.thoughtworks.xstream.annotations.XStreamA
@Table(name = "employee")
@XStreamAlias("employee")
public class Employee implements Serializable {
private static final long serialVersionUID = -6785130L;
@SequenceGenerator(name = "seq_employee_id",
allocationSize = 1, initialValue = 1,
sequenceName = "seq_employee_id")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_employee_id")
@XStreamAlias("id")
@Column(name = "first_name", length = 60, nullable = false)
@XStreamAlias("first-name")
@Column(name = "last_name", length = 60, nullable = false)
@XStreamAlias("last-name")
@Column(name = "full_name", length = 120, nullable = false)
@XStreamAlias("full-name")
@Column(name = "age", length = 3, nullable = false)
@XStreamAlias("age")
@Column(name = "sex", length = 1, nullable = false)
@XStreamAlias("sex")
@Column(name = "email", length = 255, nullable = false)
@XStreamAlias("email")
@Column(name = "cell_phone", length = 15, nullable = false)
@XStreamAlias("cell-phone")
@Column(name = "department_id", nullable = false)
@XStreamAlias("department-id")
private int
departmentId;
@Column(name = "role_id", nullable = false)
@XStreamAlias("role-id")
private int roleId;
public Employee() {}
public int getId() {
public void setId(int id) {
public String getFirstname() {
public void setFirstname(String firstname) {
this.firstname =
public String getLastname() {
public void setLastname(String lastname) {
this.lastname =
public String getFullname() {
public void setFullname(String fullname) {
this.fullname =
public int getAge() {
public void setAge(int age) {
this.age =
public int isSex() {
public void setSex(int sex) {
this.sex =
public int getSex() {
public String getEmail() {
public void setEmail(String email) {
this.email =
public String getCellphone() {
public void setCellphone(String cellphone) {
this.cellphone =
public int getDepartmentId() {
return departmentId;
public void setDepartmentId(int departmentId) {
this.departmentId = departmentId;
public int getRoleId() {
return roleId;
public void setRoleId(int roleId) {
this.roleId = roleId;
双下划线神马的,换成短线(“-")吧!
JSON格式的返回结果:
{"employee":{
"firstname":"Jackson",
"lastname":"Tom",
"fullname":"tom.jackson",
"email":"tom.",
"cellphone":"86186xxxxxxx8",
"departmentId":11,
"roleId":11
XML格式的返回结果:
相应的controller代码:
package com.homeland.myapp.
import java.util.L
import org.springframework.beans.factory.annotation.A
import org.springframework.stereotype.C
import org.springframework.web.bind.annotation.PathV
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.RequestM
import com.homeland.myapp.entity.E
import com.homeland.myapp.service.EmployeeS
import com.thoughtworks.xstream.XS
@Controller
public class EmployeeController {
@Autowired
private EmployeeService employeeS
@RequestMapping(method = RequestMethod.GET, value = "/employee/{id}")
public Employee getEmployee(@PathVariable String id) {
Employee e = employeeService.findById(Integer.parseInt(id));
@RequestMapping(method = RequestMethod.GET, value = "/employees")
public List&Employee& getAllEmployee() {
List&Employee& employees = employeeService.findAll();
&&&&推荐文章:
【上篇】【下篇】

我要回帖

更多关于 spring oxm.jar 的文章

 

随机推荐