用springmvc的@RequestBody和@ResponseBody 接收和响应json格式数据
1.controller
@Controller
@RequestMapping("/rest/v1")
public class WelcomeController {
@RequestMapping(value="/date/json/next",
method=RequestMethod.POST,consumes="application/json"
,produces="application/json")
@ResponseBody
public DateTime getNextDateJson(@RequestBody DateTime date)
{
date.getNowDate().setTime(
date.getNowDate().getTime());
return date;
}
}
2.请求参数类和返回类DateTime(DateTime原本是用来测试返回时间格式的,这里犯懒请求和返回都用同一个类)
package com.cici.example.view.domain; import java.sql.Timestamp; import com.cici.utils.TimestampSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize; public class DateTime {
String name;
@JsonSerialize(using=TimestampSerializer.class)
Timestamp nowDate;
public Timestamp getNowDate() {
return nowDate;
}
public void setNowDate(Timestamp nowDate) {
this.nowDate = nowDate;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} }
启动Tomcat然后用chrome的postman或者Firefox的httprequester发送json参数的post请求,请求参数如下
{
"nowDate":"2016-7-8T16:33:15.687",
"name":"cc"
}
如果这时候返回415 unsupport media type,有可能是下面两个原因(具体配置在 maven构建springmvc项目 中有配置)
1)messageConverters没有配置支持application/json类型
2)pom.xml没有配置Jackson的依赖(fasterxml或者haus包)
这时候nowDate的Timestamp类型springmvc是无法解析的,请求会返回400 bad request
因为我用的Jackson包是fasterxml的,所以有两种解决方式(如果用haus可能会有三种)
1)在DateTime.java类的nowDate属性上加上一句@DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"),不过这种方式需要在每个类的每个timestamp类型的属性上都配置过一次,不推荐这种方法
2)自定义一个converter,这种方式只需要配置一次,推荐这种方式
DateConverter.java
package com.cici.utils; import java.sql.Timestamp; import org.springframework.core.convert.converter.Converter; public class DateConverter implements Converter<String,Timestamp>{ @Override
public Timestamp convert(String date) {
if(null != date)
{
return Timestamp.valueOf(date);
}
return null;
}
}
然后在dispatcher-servlet.xml配置
<!--这里是把conversion-service="conversionService"加到原来的annotation-driven-->
<mvc:annotation-driven conversion-service="conversionService"/> <bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.cici.utils.DateConverter" >
</bean>
</list>
</property>
</bean>
然鹅这时候response中的nowDate返回的还是long类型的时间戳,不是具体的时间,可以针对timestamp类型的属性写一个jsonserializer(这种方法需要每个属性都配置一次,但目前没找到更好的解决方法)
TimestampSerializer.java
package com.cici.utils; import java.io.IOException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat; import com.cici.example.view.domain.DateTime;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider; /**
* @author cc
* 为每个类写一个serializer
*/
public class TimestampSerializer extends JsonSerializer<Timestamp>{ @Override
public void serialize(Timestamp dateTime, JsonGenerator generator,
SerializerProvider provider) throws IOException,
JsonProcessingException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String dateTimeFormated = sdf.format(dateTime);
generator.writeString(dateTimeFormated);
} }
然后在属性的getter方法上配置
@JsonSerialize(using=TimestampSerializer.class)
Timestamp nowDate;
public Timestamp getNowDate() {
return nowDate;
}
以上是踩到的两个坑
这个时候请求和返回如下
用json做请求体和响应体顺便处理Date类型返回Long类型时间戳问题的小李子就完成了
用springmvc的@RequestBody和@ResponseBody 接收和响应json格式数据的更多相关文章
- ajax接收遍历处理json格式数据
ajax在前后端的交互中应用非常广泛,通过请求后台接口接收处理json格式数据展现在前端页面. 下面我们来简单用 ajax在本地做一个接收并处理json的小例子 首先我们要新建一个叫做data的jso ...
- 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_8 响应json数据之响应json格式数据
springMvc的框架已经帮我们做好了.发过来的数据转换为javaBean对象 发过来的键值的形式,如果属性和javaBean对应的话,可以直接封装到对象中. key做额外的转换的时候,需要另外的j ...
- SpringMVC 实现返回一段数据 & 实现自动发送json格式数据 - AJAX
实现返回一段数据 - AJAX 当页面通过AJAX来访问Controller时,期望得到的不是一个页面而是一段数据,此时可以使用如下方法,直接向相应中写入数据: /** * 直接向响应中写出数据,通常 ...
- ajax接收处理json格式数据
ajax在前后端的交互中应用非常广泛,通过请求后台接口接收处理json格式数据展现在前端页面. 下面我们来简单用 ajax在本地做一个接收并处理json的小例子 首先我们要新建一个叫做data的jso ...
- SpringMvc+ajax 实现json格式数据传递
传JSON对象 前端 function test () { var param = {username : "yitop"}; $.ajax({ timeout : 20000, ...
- springmvc通过ajax异步请求返回json格式数据
jsp 首先创建index.jsp页面 <script type="text/javascript"> $(function () { $("#usernam ...
- play framework接收post请求json格式的参数
大家在用play framework框架开发第三方调用你的接口的时候并且用json格式的参数post请求 ,参数接收是个问题 ,因为play对表单提交post请求有处理: 有两种方法: 1.直接形参列 ...
- js使用s:property标签接收json格式数据
js使用s:property接收json数据时,会出现字符被转译的错误. 错误如下: 引号会被转译成'"'字符,导致解析不了. 错误原因: html的s:property接收不会出错,而js ...
- 存储过程接收JSON格式数据
前端有可能一次性上传多笔记录,并使用JSON序列化. 现在在MS SQL Server 2016版本上,可以直接处理JSO数据. 如下面的前端序列化的数据: DECLARE @json_string ...
随机推荐
- bzoj 1968: [Ahoi2005]COMMON 约数研究【枚举】
枚举约数,加上有这个约数的数个数 #include<iostream> #include<cstdio> using namespace std; const int N=10 ...
- LuoguP2822 组合数问题(组合数,二维前缀和)
P2822 组合数问题 输入输出样例 输入样例#1: 复制 1 2 3 3 输出样例#1: 复制 1 输入样例#2: 复制 2 5 4 5 6 7 输出样例#2: 复制 0 7 说明 [样例1说明] ...
- 你真的懂了redis的数据结构吗?redis内部数据结构和外部数据结构揭秘
原文链接:https://mp.weixin.qq.com/s/hKpAxPE-9HJgV6GEdV4WoA Redis有哪些数据结构? 字符串String.字典Hash.列表List.集合Set.有 ...
- CF767E ChangeFree【贪心/优先队列】By cellur925
题目传送门 $naive$想法 最开始的一个贪心策略是每次尽量花掉硬币 ,如果不满足条件,就花纸币.而且不满足条件的时候,要尽量向百取整.(显然是不对的,因为有时候不够)但是显然这个贪心策略是错误的, ...
- 即时编译(JIT)
即时编译(JIT : just-in-time compilation): 指计算机领域里,即时编译也被成为动态翻译,是一种通过在运行时将字节码翻译为机器码,从而改善字节码编译语言性能的技术 即时编译 ...
- 关于 typedef struct 和 struct
举个例子说明:typedef struct abc{ int x; int y; int z;}ABC;是将结构体abc类型重新起个名字为ABC,以后再定义同一类型的变量时,可以写成:ABC m,n; ...
- Android SDK Manager 无法下载Android8.1.0(API 27) SDK Platform
在Android SDK Manager 中安装Android 8.1.0 SDK Platform时报错导致无法安装. 错误信息:Downloading SDK Platform Android 8 ...
- vue项目node升级后,node-saas报错解决办法
ERROR in ./node_modules/_extract-text-webpack-plugin@3.0.2@extract-text-webpack-plugin/dist/loader.j ...
- spark block读写流程分析
之前分析了spark任务提交以及计算的流程,本文将分析在计算过程中数据的读写过程.我们知道:spark抽象出了RDD,在物理上RDD通常由多个Partition组成,一个partition对应一个bl ...
- 【学习笔记】后端中的MVC和前端MVVM的关系