SpringBoot构建电商基础秒杀项目总结
Posted hequnwang10
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot构建电商基础秒杀项目总结相关的知识,希望对你有一定的参考价值。
一、定义通用的返回对象——返回正确信息
比如修改UserController.java代码
public UserVO getUser(@RequestParam(name = "id")Integer id){
//调用service服务获取对应id的用户对象并返回给前端
UserModel userModel = userService.getUserById(id);
userModel = null;
userModel.setEncrptPassword("123");
//将核心领域模型用户对象转化为可供UI使用的viewobject
return convertFromModel(userModel);
}
重新运行,测试结果:
之前的程序一旦出错,只会返回一个白页,并没有错误信息,需要返回一个有意义的错误信息。
1、新建response包
创建CommonReturnType.java类
public class CommonReturnType {
//表明对应请求的返回处理结果“success”或“fail”
private String status;
//若status=success,则data内返回前端需要的json数据
//若status=fail,则data内使用通用的错误码格式
private Object data;
//定义一个通用的创建方法
public static CommonReturnType create(Object result) {
return CommonReturnType.create(result, "success");
}
public static CommonReturnType create(Object result,String status) {
CommonReturnType type = new CommonReturnType();
type.setStatus(status);
type.setData(result);
return type;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
2、修改UserController.java
UserController.java
@Controller("user")
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/get")
@ResponseBody
public CommonReturnType getUser(@RequestParam(name = "id")Integer id){
//调用service服务获取对应id的用户对象并返回给前端
UserModel userModel = userService.getUserById(id);
UserVO userVO = convertFromModel(userModel);
//将核心领域模型用户对象转化为可供UI使用的viewobject
return CommonReturnType.create(userVO);
}
private UserVO convertFromModel(UserModel userModel){
if (userModel==null){
return null;
}
UserVO userVO = new UserVO();
BeanUtils.copyProperties(userModel,userVO);
return userVO;
}
}
3、重新运行
重新运行项目,测试,输入
http://localhost:8090/user/get?id=1
返回数据正确!
二、定义通用的返回对象——返回错误信息
新建一个error包
1、创建commonError接口
public interface CommonError {
public int getErrCode();
public String getErrMsg();
public CommonError setErrMsg(String errMs);
}
2、EmBusinessError枚举
public enum EmBusinessError implements CommonError{
//通用错误类型00001
PARAMETER_VALIDATION_ERROR(00001, "参数不合法"),
//10000开头为用户信息相关错误定义
USER_NOT_EXIST(10001, "用户不存在")
;
private EmBusinessError(int errCode, String errMsg) {
this.errCode = errCode;
this.errMsg = errMsg;
}
private int errCode;
private String errMsg;
@Override
public int getErrCode() {
return this.errCode;
}
@Override
public String getErrMsg() {
return this.errMsg;
}
@Override
public CommonError setErrMsg(String errMs) {
this.errMsg = errMs;
return this;
}
}
3、BusinessException.java包装器模式
//包装器业务异常实现
public class BusinessException extends Exception implements CommonError{
private CommonError commonError;
//直接接受EmBusinessError的传参用于构造业务异常
public BusinessException(CommonError commonError){
super();//Exception自带一些机制
this.commonError = commonError;
}
//接收自定义errMsg的方式构造业务异常
public BusinessException(CommonError commonError, String errMsg) {
super();
this.commonError = commonError;
this.commonError.setErrMsg(errMsg);
}
@Override
public int getErrCode() {
return this.commonError.getErrCode();
}
@Override
public String getErrMsg() {
return this.commonError.getErrMsg();
}
@Override
public CommonError setErrMsg(String errMs) {
this.commonError.setErrMsg(errMs);
return this;
}
}
4、UserController.java修改
@Controller("user")
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/get")
@ResponseBody
public CommonReturnType getUser(@RequestParam(name = "id")Integer id) throws BusinessException {
//调用service服务获取对应id的用户对象并返回给前端
UserModel userModel = userService.getUserById(id);
UserVO userVO = convertFromModel(userModel);
//若获取的对应用户信息不存在
if (userModel == null) {
throw new BusinessException(EmBusinessError.USER_NOT_EXIST);
}
//将核心领域模型用户对象转化为可供UI使用的viewobject
return CommonReturnType.create(userVO);
}
private UserVO convertFromModel(UserModel userModel){
if (userModel==null){
return null;
}
UserVO userVO = new UserVO();
BeanUtils.copyProperties(userModel,userVO);
return userVO;
}
}
5、运行测试
http://localhost:8090/user/get?id=2
三、定义通用的返回对象——异常处理
1、定义exceptionHandler解决未被controller层吸收的exception
//定义exceptionHandler解决未被controller层吸收的exception
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Object handlerException(HttpServletRequest request,Exception ex){
Map<String,Object> responseData = new HashMap<>();
if (ex instanceof BusinessException){
BusinessException businessException = (BusinessException)ex;
responseData.put("errCode",businessException.getErrCode());
responseData.put("errMsg",businessException.getErrMsg());
}else {
responseData.put("errCode",EmBusinessError.UNKNOWN_ERROR.getErrCode());
responseData.put("errMsg",EmBusinessError.UNKNOWN_ERROR.getErrMsg());
}
return CommonReturnType.create(responseData,"fail");
/*
CommonReturnType commonReturnType = new CommonReturnType();
commonReturnType.setStatus("fail");
Map<String,Object> responseData = new HashMap<>();
responseData.put("errCode",businessException.getErrCode());
responseData.put("errMsg",businessException.getErrMsg());
commonReturnType.setData(responseData);
return commonReturnType;
*/
}
2、UserController.java完整代码
@Controller("user")
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/get")
@ResponseBody
public CommonReturnType getUser(@RequestParam(name = "id")Integer id) throws BusinessException {
//调用service服务获取对应id的用户对象并返回给前端
UserModel userModel = userService.getUserById(id);
UserVO userVO = convertFromModel(userModel);
//若获取的对应用户信息不存在
if (userModel == null) {
userModel.setEncrptPassword("123");
// throw new BusinessException(EmBusinessError.USER_NOT_EXIST);
}
//将核心领域模型用户对象转化为可供UI使用的viewobject
return CommonReturnType.create(userVO);
}
private UserVO convertFromModel(UserModel userModel){
if (userModel==null){
return null;
}
UserVO userVO = new UserVO();
BeanUtils.copyProperties(userModel,userVO);
return userVO;
}
//定义exceptionHandler解决未被controller层吸收的exception
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Object handlerException(HttpServletRequest request,Exception ex){
Map<String,Object> responseData = new HashMap<>();
if (ex instanceof BusinessException){
BusinessException businessException = (BusinessException)ex;
responseData.put("errCode",businessException.getErrCode());
responseData.put("errMsg",businessException.getErrMsg());
}else {
responseData.put("errCode",EmBusinessError.UNKNOWN_ERROR.getErrCode());
responseData.put("errMsg",EmBusinessError.UNKNOWN_ERROR.getErrMsg());
}
return CommonReturnType.create(responseData,"fail");
/*
CommonReturnType commonReturnType = new CommonReturnType();
commonReturnType.setStatus("fail");
Map<String,Object> responseData = new HashMap<>();
responseData.put("errCode",businessException.getErrCode());
responseData.put("errMsg",businessException.getErrMsg());
commonReturnType.setData(responseData);
return commonReturnType;
*/
}
}
3、运行测试
http://localhost:8090/user/get?id=2
4、代码优化
定义exceptionHandler解决未被controller层吸收的exception:
将handlerException的方法抽象出来,新建一个BaseController类,
BaseController.java
public class BaseController {
//定义exceptionHandler解决未被controller层吸收的exception
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Object handlerException(HttpServletRequest request, Exception ex){
Map<String,Object> responseData = new HashMap<>();
if (ex instanceof BusinessException){
BusinessException businessException = (BusinessException)ex;
responseData.put("errCode",businessException.getErrCode());
responseData.put("errMsg",businessException.getErrMsg());
}else {
responseData.put("errCode", EmBusinessError.UNKNOWN_ERROR.getErrCode());
responseData.put("errMsg",EmBusinessError.UNKNOWN_ERROR.getErrMsg());
}
return CommonReturnType.create(responseData,"fail");
/*
CommonReturnType commonReturnType = new CommonReturnType();
commonReturnType.setStatus("fail");
Map<String,Object> responseData = new HashMap<>();
responseData.put("errCode",businessException.getErrCode());
responseData.put("errMsg",businessException.getErrMsg());
commonReturnType.setData(responseData);
return commonReturnType;
*/
}
}
UserController.java修改
@Controller("user")
@RequestMapping("/user")
public class UserController extends BaseController{
@Autowired
private UserService userService;
@RequestMapping("/get")
@ResponseBody
public CommonReturnType getUser(@RequestParam(name = "id")Integer id) throws BusinessException {
//调用service服务获取对应id的用户对象并返回给前端
UserModel userModel = userService.getUserById(id);
UserVO userVO = convertFromModel(userModel);
//若获取的对应用户信息不存在
if (userModel == null) {
// userModel.setEncrptPassword("123");
throw new BusinessException(EmBusinessError.USER_NOT_EXIST);
}
//将核心领域模型用户对象转化为可供UI使用的viewobject
return CommonReturnType.create(userVO);
}
private UserVO convertFromModel(UserModel userModel){
if (userModel==null){
return null;
}
UserVO userVO = new UserVO();
BeanUtils.copyProperties(userModel,userVO);
return userVO;
}
}
运行测试
http://localhost:8090/user/get?id=2
以上是关于SpringBoot构建电商基础秒杀项目总结的主要内容,如果未能解决你的问题,请参考以下文章