用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类型时间戳问题的小李子就完成了

时间: 2024-12-08 18:59:53

用springmvc的@RequestBody和@ResponseBody 接收和响应json格式数据的相关文章

ajax接收遍历处理json格式数据

转载源:http://www.cnblogs.com/dibaosong/p/4572274.html ajax在前后端的交互中应用非常广泛,通过请求后台接口接收处理json格式数据展现在前端页面. 下面我们来简单用 ajax在本地做一个接收并处理json的小例子 首先我们要新建一个叫做data的json文件data.json. data.json文件内容是: [    {"name":"小明","sex":"男","

SpringMVC 统一返回JSON格式数据到前端

有时在给APP做接口功能的时候,都是返回JSON格式的数据,所以最好的只好在工程设置一个统一的数据返回方式 在SpringMVC 直接配置XML可以产生这种配置,比较简单 Spring的版本我用的是4.3.3的 <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter&qu

springMVC传递JSON格式数据

这两天在使用SpringMVC传递JSON数据格式,出现了各种令人头大的问题,但是功夫不负有心人,最后还是解决了问题.在这里记录下来供大家参考,如有不对,还请各位大侠指正. 在SpringMVC传递JSON数据格式需要加入两个jar包:com.springsource.org.codehaus.jackson-1.4.2.jar,com.springsource.org.codehaus.jackson.mapper-1.4.2.jar. 实体JavaBean:Person  具有tname,g

Spring接收和响应json数据

一.前言 关于什么是json以及基本使用技巧,为什么使用json等等,这里不再重复,直接进入主题 注:服务端接收json数据还原为java对象,称为反序列化,反之,将java对象作为响应转换为json数据发回给客户端,称为序列化 二.导入json相关框架的依赖(比如jackson) 如果使用的是spring boot框架,导入spring boot相关依赖后,就存在相关依赖,无需重复,否则会报错:   如果使用的是spring MVC框架,就需要手动导入相关依赖(比如Jackson),直接上代码

SpringMVC环境下实现的Ajax异步请求(JSON格式数据)

一 环境搭建 首先是常规的spring mvc环境搭建,不用多说,需要注意的是,这里需要引入jackson相关jar包,然后在spring配置文件"springmvc-servlet.xml"中添加json解析相关配置,我这里的完整代码如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schem

springmvc通过ajax异步请求返回json格式数据

jsp 首先创建index.jsp页面 <script type="text/javascript"> $(function () { $("#username").click(function () { $.ajax({ url: "list",//请求地址 type: "POST", dataType: "json", success: function(data) {//data是默认的,

php接收json格式数据(text/xml)

在API服务中,目前流行采用json形式来交互. 给前端调用的接口输出Json数据,这个比较简单,只需要组织好数据,用json_encode($array) 转化一下,前端就得到json格式的数据. 接收前端提交的json数据稍微复杂一点,原因是:PHP默认识别的数据类型是application/x-www.form-urlencoded标准的数据类型.因此,对型如text/xml 或者 soap 或者 application/octet-stream 和application/json格式之类

SpringMVC 目标方法返回 json 格式数据

第一种方法:使用  @ResponseBody 注解来实现 1.Spring MVC 配置 <mvc:annotation-driven></mvc:annotation-driven>.添加该配置的作用如下,而我们用到的是... 2.添加 jackson-annotations-2.1.5.jar.jackson-core-2.1.5.jar.jackson-databind-2.1.5.jar 三个注解. 3.在 handler 目标方法中返回集合类型数据并添加 @Respon

用springMVC构建restful程序,接收以及返回json数据格式

主要参考文章:http://kingxss.iteye.com/blog/1487745和http://blog.csdn.net/greensurfer/article/details/19296247 maven 下载 源码和javadoc命令 http://blog.csdn.net/topwqp/article/details/8902863如通过maven命令:mvn dependency:sourcesmvn dependency:resolve -Dclassifier=javad