ic class Result<T> implements Serializable {
private static final long serialVersionUID = 1L;
private String code;
private String msg;
private T data;
public static<T> Result<T> success() {
return success(null);
}
public static<T> Result<T> success(T data) {
Result result = new Result<>();
result.setCode(ResultCode.SUCCESS.getCode());
result.setMsg(ResultCode.SUCCESS.getMsg());
result.setData(data);
return result;
}
public static <T> Result<T> error(String msg) {
Result<T> result = new Result<>();
result.setCode(ResultCode.ERROR.getCode());
result.setMsg(ResultCode.ERROR.getMsg());
return result;
}
}
到此,统一响应返回我们已经封装好了,我们来改造一下Controller中的代码看看效果
SysUserController
未改之前
@RequestMapping(value = "/querySysUser",method = RequestMethod.GET)
public List<SysUser> querySysUser(){
return sysUserService.querySyserList();
}
SysUserController
修改之后
@RequestMapping(value = "/querySysUser",method = RequestMethod.GET)
public Result querySysUser(){
return Result.success(sysUserService.querySyserList());
}
前端返回结果
五、定义值对象VO
从上面的返回结果,我们会发现将密码等敏感信息返回到了前端,这是非常不可取的
这时,我们就需要根据前端的需求,灵活地选择需要展示的数据字段
如果你还傻傻分不清PO BO VO DTO POJO DAO DO 这些概念,可以看看知乎的这篇文章,个人觉得还是说的比较清楚的了
https://www.zhihu.com/question/39651928/answer/2490565983
5.1 定义VO
定义一个需要返回前端的VO
@Data
public class UserInfoVO {
/**
* 用户名
*/
private String username;
/**
* 用户昵称
*/
private String nickname;
/**
* 用户性别
*/
private String sex;
/**
* 用户生日
*/
private Date birthday;
/**
* 用户邮箱
*/
private String email;
/**
* 用户电话
*/
private String phone;
/**
* 用户地址
*/
private String addr;
}
5.2 service 改造
interface SysUserService
改造前
public interface SysUserService {
List<SysUser> querySyserList();
}
interface SysUserService
改造后
public interface SysUserService {
List<UserInfoVO> querySyserList();
}
SysUserServiceImpl
改造前
@Service
public class SysUserServiceImpl implements SysUserService {
@Resource
private SysUserMapper userMapper;
@Override
public List<SysUser> querySyserList() {
return userMapper.querySyserList();
}
}
SysUserServiceImpl
改造后
@Service
public class SysUserServiceImpl implements SysUserService {
@Resource
private SysUserMapper userMapper;
@Override
public List<UserInfoVO> querySyserList() {
List<UserInfoVO> userInfoVOList = new ArrayList<UserInfoVO>();
List<SysUser> sysUserList= userMapper.querySyserList();
for (SysUser sysUser : sysUserList) {
UserInfoVO userInfoVO = new UserInfoVO();
BeanUtils.copyProperties(sysUser,userInfoVO);
userInfoVOList.add(userInfoVO);
}
return userInfoVOList;
}
}
service 返回由原来的SysUser -->变成UserInfoVO
5.3 接口测试
浏览器地址栏输入:http://localhost:8080/sysUser/querySysUser
这时返回前端的json数据中已经没有密码了
六、日期时间处理
认真看文章的小伙伴可能已经发现了,前面返回的json数据中,日期是 "birthday": "1999-09-18T16:00:00.000+00:00" 这样的
这样的日期可读性非常差,有没有什么方法可以格式化下日期呢?
其实呢,日期格式化非常简单,我们只需要在之前定义好的UserInfoVO
的日期属性上加上一个注解即可
import com.fasterxml.jackson.annotation.JsonFormat;
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;
我们来测试一下
通过格式化的日期就是我们习惯的日期格式了
七、统一异常处理
日常开发中,我们处理异常一般都会用到try-catch
、throw
和throws
的方式抛出异常。
这种方式不仅仅程序员