spring 中的json返回默认使用Jackson来处理。
Json返回 Controller@RequestMapping("getUser")
@ResponseBody
public User getUser(){
User user = new User();
user.setName("李四");
user.setAge(11);
return user;
}
@ResponseBody
没错,只需要在Controller方法上使用@ResponseBody注解,即可将我们的Controller方法返回的对象通过json格式返回给前端。
示例执行结果 以下方式也是json返回@RestController
@RequestMapping("demo4")
public class Demo4Controller {
@RequestMapping("getUser")
public User getUser(){
User user = new User();
user.setName("李四");
user.setAge(11);
return user;
}
}
@RestController
@RestController注解源码如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@documented
@Controller
@ResponseBody
public @interface RestController {
@AliasFor(
annotation = Controller.class
)
String value() default "";
}
Json返回的类型转换问题我们可以看到@RestController有@Controller和@ResponseBody两个注解的作用,通常情况下,在当前Controller都是json返回的情况下我们就直接使用@RestController来简化我们的代码。
我们在003-Spring MVC URL映射与参数绑定一章中最后提到前端通过json发送参数给我们,我们后端使用@RequestBody注解结合对象Bean来接受参数。
我们在004-Spring MVC参数类型转换一章中提到json参数接受的类型转换的配置的两种方式。
实际项目中Json返回的正确格式以上提到的json类型转换配置同样作用与我们的json对象返回。所以我们在上面json对象返回时,数据的类型以及对应的格式都没有问题。
在上面的示例中我直接将User对象进行了返回。请求成功的情况下返回结果为
{
"name": "李四",
"age": 11
}
但如果我们的Controller出现异常呢?或者Controller在参数验证的时候参数验证不通过呢?这是极端情况。
而且前端拿到我们的返回后无法判断是否是成功返回。
所以通常情况下我都会定义一个统一的类,该类包含当前请求是否成功,成功或失败时的提示信息,以及当前请求的返回值对象。如我们下面定义的MyResponse对象
package com.yyoo.framework.bean; public class MyResponse{ private boolean success; private String msg; private int status; private int bizCode; private T content; private MyResponse(){} public static final MyResponse success(){ MyResponse response = new MyResponse (); response.setSuccess(true); response.setStatus(200); return response; } public static final MyResponse success(String msg){ MyResponse response = success(); response.setMsg(msg); return response; } public static final MyResponse success(T content){ MyResponse response = success(); response.setContent(content); return response; } public static final MyResponse success(String msg,T content){ MyResponse response = success(); response.setContent(content); response.setMsg(msg); return response; } public static final MyResponse error(String msg){ MyResponse response = new MyResponse (); response.setMsg(msg); response.setSuccess(false); response.setStatus(500); return response; } public static final MyResponse error(String msg,int bizCode){ MyResponse response = error(msg); response.setBizCode(bizCode); return response; } public static final MyResponse error(String msg,T content){ MyResponse response = error(msg); response.setContent(content); return response; } public static final MyResponse error(String msg,T content,int bizCode){ MyResponse response = error(msg); response.setContent(content); response.setBizCode(bizCode); return response; } //------------------------------------------------------ public boolean isSuccess() { return success; } public void setSuccess(boolean success) { this.success = success; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public int getBizCode() { return bizCode; } public void setBizCode(int bizCode) { this.bizCode = bizCode; } public T getContent() { return content; } public void setContent(T content) { this.content = content; } }
有了MyResponse对象后,我们的Json返回的代码如下:
package com.yyoo.springmvc.controller;
import com.yyoo.springmvc.bean.MyResponse;
import com.yyoo.springmvc.bean.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("demo4")
public class Demo4Controller {
@RequestMapping("getUser")
public MyResponse getUser(){
try {
User user = new User();
user.setName("李四");
user.setAge(11);
return MyResponse.success("请求用户数据成功!",user);
}catch (Exception e){
return MyResponse.error("请求用户数据出错!");
}
}
}
前端拿到结果只需要通过success字段是否为true来判断请求是否成功,如果是false显示后台返回的提示信息或者前端自行处理即可。
示例中我们在Controller全局使用了try…catch,用于处理异常情况。Spring也提供了相应的全局异常处理机制,我们将在下一章说明。
上一篇:008-Spring MVC ViewResolver视图解析器
下一篇:待续



