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 "";
}
我们可以看到@RestController有@Controller和@ResponseBody两个注解的作用,通常情况下,在当前Controller都是json返回的情况下我们就直接使用@RestController来简化我们的代码。
Json返回的类型转换问题
我们在003-Spring MVC URL映射与参数绑定一章中最后提到前端通过json发送参数给我们,我们后端使用@RequestBody注解结合对象Bean来接受参数。
我们在004-Spring MVC参数类型转换一章中提到json参数接受的类型转换的配置的两种方式。
以上提到的json类型转换配置同样作用与我们的json对象返回。所以我们在上面json对象返回时,数据的类型以及对应的格式都没有问题。
实际项目中Json返回的正确格式
在上面的示例中我直接将User对象进行了返回。请求成功的情况下返回结果为
{
"name": "李四",
"age": 11
}
但如果我们的Controller出现异常呢?或者Controller在参数验证的时候参数验证不通过呢?这是极端情况。 而且前端拿到我们的返回后无法判断是否是成功返回。 所以通常情况下我都会定义一个统一的类,该类包含当前请求是否成功,成功或失败时的提示信息,以及当前请求的返回值对象。如我们下面定义的MyResponse对象
MyResponse对象
package com.yyoo.framework.bean;
public class MyResponse<T> {
private boolean success;
private String msg;
private int status;
private int bizCode;
private T content;
private MyResponse(){}
public static final <T> MyResponse<T> success(){
MyResponse<T> response = new MyResponse<T>();
response.setSuccess(true);
response.setStatus(200);
return response;
}
public static final <T> MyResponse<T> success(String msg){
MyResponse<T> response = success();
response.setMsg(msg);
return response;
}
public static final <T> MyResponse<T> success(T content){
MyResponse response = success();
response.setContent(content);
return response;
}
public static final <T> MyResponse<T> success(String msg,T content){
MyResponse response = success();
response.setContent(content);
response.setMsg(msg);
return response;
}
public static final <T> MyResponse<T> error(String msg){
MyResponse<T> response = new MyResponse<T>();
response.setMsg(msg);
response.setSuccess(false);
response.setStatus(500);
return response;
}
public static final <T> MyResponse<T> error(String msg,int bizCode){
MyResponse<T> response = error(msg);
response.setBizCode(bizCode);
return response;
}
public static final <T> MyResponse<T> error(String msg,T content){
MyResponse<T> response = error(msg);
response.setContent(content);
return response;
}
public static final <T> MyResponse<T> error(String msg,T content,int bizCode){
MyResponse<T> 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视图解析器 下一篇:待续
|