请教spring mvc jsonMvc的controller如何处理json对象数组

请教springMvc的controller如何处理json对象数组
[问题点数:40分,结帖人songwei1024]
请教springMvc的controller如何处理json对象数组
[问题点数:40分,结帖人songwei1024]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。&mvc:annotation-driven&&&&&&&&!--&处理responseBody&里面日期类型&--&&&&&&&&&&&&mvc:message-converters&&&&&&&&&&&&&&&&bean&class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"&&&&&&&&&&&&&&&&&&&&property&name="objectMapper"&&&&&&&&&&&&&&&&&&&&&&&&bean&class="com.fasterxml.jackson.databind.ObjectMapper"&&&&&&&&&&&&&&&&&&&&&&&&&&&&property&name="dateFormat"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&bean&class="java.text.SimpleDateFormat"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&constructor-arg&type="java.lang.String"&value="yyyy-MM-dd&HH:mm:ss"&/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/bean&&&&&&&&&&&&&&&&&&&&&&&&&&&&/property&&&&&&&&&&&&&&&&&&&&&&&&/bean&&&&&&&&&&&&&&&&&&&&/property&&&&&&&&&&&&&&&&/bean&&&&&&&&&&&&/mvc:message-converters&&&&&&&&/mvc:annotation-driven&&&方法二:局部注解处理&import&java.io.IOE&&import&java.text.SimpleDateF&&import&java.util.D&&&&import&com.fasterxml.jackson.core.JsonG&&import&com.fasterxml.jackson.core.JsonProcessingE&&import&com.fasterxml.jackson.databind.JsonS&&import&com.fasterxml.jackson.databind.SerializerP&&&&/**&&&*&ClassName:DateJsonSerializer&&br/&&&&*&Function:&日期类型格式化,格式化为:yyyy-MM-dd&HH:mm:ss&格式.&用法如下:&br/&&&&*&Reason:&&&@JsonSerialize(using=DateJsonSerializer.class)&&*&&&&&&&&&&&@Column(name="BIRTHDAY")&&*&&&&&&&&&&&public&Date&getBirthday()&{&&*&&&&&&&&&&&&&&return&&&*&&&&&&&&&&&}&&*&&&&&&&&&&.&&br/&&&&*&Date:&&&&&日&下午1:26:08&&br/&&&&*&@author&&&zhangzhaoyu&&&*&@version&&&1.0&&*&@since&&&&JDK&1.7&&&*&@see&&&&&&&&&*/&&public&class&DateJsonSerializer&extends&JsonSerializer&Date&&{&&&&&&&&@Override&&&&&&public&void&serialize(Date&value,&JsonGenerator&jgen,&&&&&&&&&&&&&&SerializerProvider&provider)&throws&IOException,&&&&&&&&&&&&&&JsonProcessingException&{&&&&&&&&&&&SimpleDateFormat&formatter&=&new&SimpleDateFormat("yyyy-MM-dd&HH:mm:ss");&&&&&&&&&&&String&formattedDate&=&formatter.format(value);&&&&&&&&&&&jgen.writeString(formattedDate);&&&&&&}&&&&} &方法三:jackson 注解处理@JsonIgnoreProperties&&&&&&&&&&&此注解是类注解,作用是json序列化时将java&bean中的一些属性忽略掉,序列化和反序列化都受影响。&&&&@JsonIgnore&&&&&&&&&&&此注解用于属性或者方法上(最好是属性上),作用和上面的@JsonIgnoreProperties一样。&&&&@JsonFormat&&&&&&&&&&此注解用于属性或者方法上(最好是属性上),可以方便的把Date类型直接转化为我们想要的模式,比如@JsonFormat(pattern&=&"yyyy-MM-dd&HH-mm-ss")&&&&@JsonSerialize&&&&&//&反序列化一个固定格式的Date&&&&&&&&@JsonDeserialize(using&=&CustomDateDeserialize.class)&&&&&&&&public&void&setBirthday(Date&birthday)&{&&&&&&&&&&&&this.birthday&=&&&&&&&&&}&&&&&&//&序列化指定格式的double格式&&&&&&&&@JsonSerialize(using&=&CustomDoubleSerialize.class)&&&&&&&&public&double&getSalary()&{&&&&&&&&&&&&return&&&&&&&&&}&&&&&&public&class&CustomDateDeserialize&extends&JsonDeserializer&Date&&{&&&&&&&&&&&&private&SimpleDateFormat&sdf&=&new&SimpleDateFormat("yyyy-MM-dd");&&&&&&&&&&&&@Override&&&&&&&&public&Date&deserialize(JsonParser&jp,&DeserializationContext&ctxt)&&&&&&&&&&&&&&&&throws&IOException,&JsonProcessingException&{&&&&&&&&&&&&&&&&Date&date&=&null;&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&date&=&sdf.parse(jp.getText());&&&&&&&&&&&&}&catch&(ParseException&e)&{&&&&&&&&&&&&&&&&e.printStackTrace();&&&&&&&&&&&&}&&&&&&&&&&&&return&&&&&&&&&}&&&&} &&摘自:http://blog.csdn.net/zhanngle/article/details/&&又到搭新开发环境的时候,总是不免去网上搜下目前最新的框架。spring是web开发必用的框架,于是乎下载了目前最新的spring4.0.3,同时越来越不想用struts2,想试试spring mvc,也将spring-webmvc4.0.3下了下来,投入两天时间学习后,发现还是挺优雅的,特别是从3.0后,spring mvc使用注解方式配制,以及对rest风格的支持,真是完美致极。下面将这两天研究到的问题做个总结,供参考。1.request对象的获取方式1:在controller方法上加入request参数,spring会自动注入,如:public&String&list(HttpServletRequest&request,HttpServletResponse&response)方式2:在controller类中加入@Resource private HttpServletRequest request 属性,spring会自动注入,这样不知道会不会出现线程问题,因为一个controller实例会为多个请求服务,暂未测试。方式3:在controller方法中直接写代码获取&HttpServletRequest&request&=&((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();方式4:在controller中加入以下方法,此方法会在执行此controller的处理方法之前执行@ModelAttribute&&private&void&initServlet(HttpServletRequest&request,HttpServletResponse&response)&{&&&&&&//String&p=request.getParameter("p");&&&&&&//this.req=//实例变量,有线程安全问题,可以使用ThreadLocal模式保存&&} &2.response对象的获取可以参照以上request的获取方式1和方式4,方式2和方式3对response对象无效!3.表单提交之数据填充直接在方法上加入实体对象参数,spring会自动填充对象中的属性,对象属性名要与&input&的name一致才会填充.如:public boolean doAdd(Demo demo)4.表单提交之数据转换-Date类型在实体类的属性或get方法上加入 @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss"),那么表单中的日期字符串就会正确的转换为Date类型了。还有@NumberFormat注解,暂时没用,就不介绍了,一看就知道是对数字转换用的。5.json数据返回在方法上加入@ResponseBody,同时方法返回值为实体对象,spring会自动将对象转换为json格式,并返回到客户端。如下所示:@RequestMapping("/json1")&&@ResponseBody&&public&Demo&json1()&{&&&&&&Demo&demo=new&Demo();&&&&&&demo.setBirthday(new&Date());&&&&&&demo.setCreateTime(new&Date());&&&&&&demo.setHeight(170);&&&&&&demo.setName("tomcat");&&&&&&&demo.setRemark("json测试");&&&&&&&demo.setStatus((short)1);&&&&&&&return&&&} &注意:spring配置文件要加上:&mvc:annotation-driven/&,同时还要引入jackson-core.jar,jackson-databind.jar,jackson-annotations.jar(2.x的包)才会自动转换json这种方式是spring提供的。我们还可以自定义输出json,以上第二条不是说了获取response对象吗,拿到response对象后,任由开发人员宰割,想怎么返回就怎么返回。方法不要有返回值,如下:@RequestMapping("/json2")&&public&void&json2()&{&&&&&&Demo&demo=new&Demo();&&&&&&demo.setBirthday(new&Date());&&&&&&demo.setCreateTime(new&Date());&&&&&&demo.setHeight(170);&&&&&&demo.setName("tomcat");&&&&&&demo.setRemark("json测试");&&&&&&demo.setStatus((short)1);&&&&&&String&json=JsonUtil.toJson(obj);//;json处理工具类&&&&&&HttpServletResponse&response&=&//获取response对象&&&&&&response.getWriter().print(json);&&} &OK,一切很完美。接着恶心的问题迎面而来,date类型转换为json字符串时,返回的是long time值,如果你想返回“yyyy-MM-dd HH:mm:ss”格式的字符串,又要自定义了。我很奇怪,不是有@DateTimeFormat注解吗,为什么不利用它。难道@DateTimeFormat只在表单提交时,将字符串转换为date类型,而date类型转换为json字符串时,就不用了。带着疑惑查源码,原来spring使用jackson转换json字符,而@DateTimeFormat是spring-context包中的类,jackson如何转换,spring不方便作过多干涉,于是只能遵守jackson的转换规则,自定义日期转换器。先写一个日期转换器,如下:public&class&JsonDateSerializer&extends&JsonSerializer&Date&&{&&&&&private&SimpleDateFormat&dateFormat=new&SimpleDateFormat("yyyy-MM-dd&HH:mm:ss");&&&&&@Override&&&&&public&void&serialize(Date&date,&JsonGenerator&gen,&SerializerProvider&provider)&&throws&IOException,&JsonProcessingException&{&&&&&&&&&String&value&=&dateFormat.format(date);&&&&&&&&&gen.writeString(value);&&&&&}&&} &在实体类的get方法上配置使用转换器,如下:@DateTimeFormat(pattern="yyyy-MM-dd&HH:mm:ss")&&@JsonSerialize(using=JsonDateSerializer.class)&&public&Date&getCreateTime()&{&&&&&&return&this.createT&&} &OK,到此搞定。你真的满意了吗,这么不优雅的解决方案,假设birthday属性是这样的,只有年月日,无时分秒@DateTimeFormat(pattern="yyyy-MM-dd")&&public&Date&getBirthday()&{&&&&&&return&this.&&}&&这意味着,又要为它定制一个JsonDate2Serializer的转换器,然后配置上,像这样@DateTimeFormat(pattern="yyyy-MM-dd")&&@JsonSerialize(using=JsonDate2Serializer.class)&&public&Date&getBirthday()&{&&&&&&return&this.&&} &假设还有其它格式的Date字段,还得要为它定制另一个转换器。my god,请饶恕我的罪过,不要让我那么难受经过分析源码,找到一个不错的方案,此方案将不再使用@JsonSerialize,而只利用@DateTimeFormat配置日期格式,jackson就可以正确转换,但@DateTimeFormat只能配置在get方法上,这也没什么关系。先引入以下类,此类对jackson的ObjectMapper类做了注解扫描拦截,使它也能对加了@DateTimeFormat的get方法应用日期格式化规则package&com.xxx.&&&&import&java.io.IOE&&import&java.lang.reflect.AnnotatedE&&import&java.text.SimpleDateF&&import&java.util.D&&import&org.springframework.format.annotation.DateTimeF&&import&org.&&import&com.fasterxml.jackson.core.JsonG&&import&com.fasterxml.jackson.core.JsonProcessingE&&import&com.fasterxml.jackson.databind.JsonS&&import&com.fasterxml.jackson.databind.ObjectM&&import&com.fasterxml.jackson.databind.SerializerP&&import&com.fasterxml.jackson.databind.introspect.A&&import&com.fasterxml.jackson.databind.introspect.AnnotatedM&&import&com.fasterxml.jackson.databind.introspect.JacksonAnnotationI&&&&/**&&*&json处理工具类&&*&@author&zhangle&&*/&&@Component&&public&class&JsonUtil&{&&&&&&&&&&private&static&final&String&DEFAULT_DATE_FORMAT="yyyy-MM-dd&HH:mm:ss";&&&&&&&&&&private&static&final&ObjectMapper&&&&&&&&&&&&&&&&&&&&&public&ObjectMapper&getMapper()&{&&&&&&&&&&&&&&&&&&return&&&&&&&&&&&}&&&&&&&&&&&&static&{&&&&&&&&&&&&&&&&&&SimpleDateFormat&dateFormat&=&new&SimpleDateFormat(DEFAULT_DATE_FORMAT);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&mapper&=&new&ObjectMapper();&&&&&&&&&&&&&&&&&&mapper.setDateFormat(dateFormat);&&&&&&&&&&&&&&&&&&mapper.setAnnotationIntrospector(new&JacksonAnnotationIntrospector()&{&&&&&&&&&&&&&&&&&&&&&&&&&&@Override&&&&&&&&&&&&&&&&&&&&&&&&&&public&Object&findSerializer(Annotated&a)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(a&instanceof&AnnotatedMethod)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&AnnotatedElement&m=a.getAnnotated();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DateTimeFormat&an=m.getAnnotation(DateTimeFormat.class);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(an!=null)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(!DEFAULT_DATE_FORMAT.equals(an.pattern()))&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&new&JsonDateSerializer(an.pattern());&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&super.findSerializer(a);&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&});&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&public&static&String&toJson(Object&obj)&{&&&&&&&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&&&&&&&&&&&return&mapper.writeValueAsString(obj);&&&&&&&&&&&&&&&&&&}&catch&(Exception&e)&{&&&&&&&&&&&&&&&&&&&&&&&&&&throw&new&RuntimeException("转换json字符失败!");&&&&&&&&&&&&&&&&&&}&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&public&&T&&T&toObject(String&json,Class&T&&clazz)&{&&&&&&&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&&&&&&&&&&&return&mapper.readValue(json,&clazz);&&&&&&&&&&&&&&&&&&}&catch&(IOException&e)&{&&&&&&&&&&&&&&&&&&&&&&&&&&throw&new&RuntimeException("将json字符转换为对象时失败!");&&&&&&&&&&&&&&&&&&}&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&public&static&class&JsonDateSerializer&extends&JsonSerializer&Date&{&&&&&&&&&&&&&&private&SimpleDateFormat&dateF&&&&&&&&&&&&&&public&JsonDateSerializer(String&format)&{&&&&&&&&&&&&&&&&&&&dateFormat&=&new&SimpleDateFormat(format);&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&@Override&&&&&&&&&&&&&&public&void&serialize(Date&date,&JsonGenerator&gen,&SerializerProvider&provider)&&&&&&&&&&&&&&&&&&&&&&throws&IOException,&JsonProcessingException&{&&&&&&&&&&&&&&&&&&String&value&=&dateFormat.format(date);&&&&&&&&&&&&&&&&&&gen.writeString(value);&&&&&&&&&&&&&&}&&&&&&&&&&}&&} &再将&mvc:annotation-driven/&改为以下配置,配置一个新的json转换器,将它的ObjectMapper对象设置为JsonUtil中的objectMapper对象,此转换器比spring内置的json转换器优先级更高,所以与json有关的转换,spring会优先使用它。&mvc:annotation-driven&&&&&&&&mvc:message-converters&&&&&&&&&&&&bean&class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"&&&&&&&&&&&&&&&&property&name="objectMapper"&value="#{jsonUtil.mapper}"/&&&&&&&&&&&&&&&&property&name="supportedMediaTypes"&&&&&&&&&&&&&&&&&&&&list&&&&&&&&&&&&&&&&&&&&&&&&value&text/charset=UTF-8&/value&&&&&&&&&&&&&&&&&&&&/list&&&&&&&&&&&&&&&&/property&&&&&&&&&&&&&&/bean&&&&&&&&/mvc:message-converters&&&&/mvc:annotation-driven&&&接下来就可以这样配置实体类,jackson也能正确转换Date类型@DateTimeFormat(pattern="yyyy-MM-dd&HH:mm:ss")&&public&Date&getCreateTime()&{&&&&&&return&this.createT&&}&&@DateTimeFormat(pattern="yyyy-MM-dd")&&public&Date&getBirthday()&{&&&&&&return&this.&&} &完毕,一切都完美了。以下为 补充写了那么多,发现白忙活了一场,原来jackson也有一个@JsonFormat注解,将它配置到Date类型的get方法上后,jackson就会按照配置的格式转换日期类型,而不自定义转换器类,欲哭无泪啊。辛苦了那么多,其实别人早已提供,只是没有发现而已。不说了,直接上方案吧。1.spring配置照样是这样:2.JsonUtil可以不用了,但如果要自己从response对象输出json,那么还是可以用,但改成了这样package&com.xxx.&&&&import&java.io.IOE&&import&java.text.SimpleDateF&&import&org.&&import&com.fasterxml.jackson.databind.ObjectM&&&&/**&&*&json处理工具类&&*&@author&zhangle&&*/&&@Component&&public&class&JsonUtil&{&&&&&&&&private&static&final&String&DEFAULT_DATE_FORMAT="yyyy-MM-dd&HH:mm:ss";&&&&&&private&static&final&ObjectMapper&&&&&&&&&static&{&&&&&&&&&&SimpleDateFormat&dateFormat&=&new&SimpleDateFormat(DEFAULT_DATE_FORMAT);&&&&&&&&&&mapper&=&new&ObjectMapper();&&&&&&&&&&mapper.setDateFormat(dateFormat);&&&&&&}&&&&&&&&&&&&public&static&String&toJson(Object&obj)&{&&&&&&&&&&try&{&&&&&&&&&&&&&&return&mapper.writeValueAsString(obj);&&&&&&&&&&}&catch&(Exception&e)&{&&&&&&&&&&&&&&throw&new&RuntimeException("转换json字符失败!");&&&&&&&&&&}&&&&&&}&&&&&&&&&&&&public&&t&&T&toObject(String&json,Class&t&&clazz)&{&&&&&&&&&&try&{&&&&&&&&&&&&&&return&mapper.readValue(json,&clazz);&&&&&&&&&&}&catch&(IOException&e)&{&&&&&&&&&&&&&&throw&new&RuntimeException("将json字符转换为对象时失败!");&&&&&&&&&&}&&&&&&}&&}3.实体类的get方法就需要多一个@JsonFormat的注解配置@DateTimeFormat(pattern="yyyy-MM-dd&HH:mm:ss")&&@JsonFormat(pattern="yyyy-MM-dd&HH:mm:ss",timezone&=&"GMT+8")&&public&Date&getCreateTime()&{&&return&this.createT&&}&&@DateTimeFormat(pattern="yyyy-MM-dd")&&@JsonFormat(pattern="yyyy-MM-dd",timezone&=&"GMT+8")&&public&Date&getBirthday()&{&&&&&&return&this.&&} &
积分与排名
阅读排行榜请教springMvc的controller如何处理json对象数组_百度知道
请教springMvc的controller如何处理json对象数组
提问者采纳
json&POST&quot: &: &application&#47,
success.ajax(
url.stringify(x): &quot,
contentT@RequestBody 用这个接受你的对象参数 例子 public @ResponseBody String saveDocumentBook(@RequestBody 对象json&
type: JSON: function(data){
其他类似问题
为您推荐:
对象数组的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁springmvc项目中调用controller方法报406错误
在controller类的方法中添加了注解:@ResponseBody
网页抛出错误: The resource identified by this request is only capable of generating responses with characteristics not
21:49&&&[]
1、这段时间开发使用springmvc技术,前端的使用html5、ajax 2、平常写action链接的时候使用.html都没有问题,今天在查询列表数据的时候出现ajaxj中Query.parseJSON(XMLHttpRequest.responseText);报错, 3、导致这个原因是
16:10&&&[]
就报406,说明spring没有处理好对象序列化成json的问题,最后我通过log4j打印的日志,也清晰的看到他返回的格式并非json格式.
既然格式错误了,浏览器当然接受不了数据,原因就在此了
2.知道了原因,于是就上网搜了.网上有人说mvc的xml没有加这个配置
&!-- 开启注解
10:26&&&[]
我今天在做SDK工程的时候,突然产生一个想法:能否把我项目中的所有Url和Method的映射信息打印出来?以便我一眼就看出我已经完成了那些API接口开发,这些方法需要什么参数。就像下图所示:
有了想法就要用行动,第一步肯定是要去看看别人是否已经解决了这个问题啦。查了半天的资料,倒是发现有几个相似
11:23&&&[]
17:28&&&[]
02:25&&&[]
SpringMVC ajax请求406 错误解决方案: &&&&在springMVC配置文件中添加以下代码: &!--避免ajax请求出现406错误--& &bean&id=&quot
11:55&&&[]
406 Not Acceptable 缺少转换依赖的jar包,设置了@ResponseBody,要把对象转换成json格式。
解决方法: pom.xml文件增加
&dependency& &groupId&org.codehaus.jackson&lt
12:59&&&[]
至此我们的出口报运的增删改查的Mapper以及Dao还有Service以及Controller层的编写,list列表获取的方法。我们下一次开始编写出口报运的其他业务方法。
版权声明:本文为博主原创文章,未经博主允许不得转载。
19:52&&&[]
&mvc:view-controller path=&/& view-name=&redirect:/admin/index&/&
即如果当前路径是/ 则重定向到/admin/index
2、view name
15:51&&&[]
请教大家,我想在&请求某个controller时,默认执行一个方法,目的是获取http请求的一些参数,注意这个方法是带参数的。不知道是哪个方法可以,获取有什么别的方式?
回复讨论(解决方案)
请教大家,我想在&请求某个controller时,默认执行一个方法,目的是
17:28&&&[]
&&&&&&&&如题。这篇博客讲诉你如何在在spring+springmvc+mybatis项目中调用oracle的存储过程(procedure),其实主要是mybatis下如何调用存储过程,不带参数的就不说了,就说
23:57&&&[]

我要回帖

更多关于 spring mvc json 配置 的文章

 

随机推荐