public class UserDO { private Integer id; private String name; private Boolean gender; private Integer age; private String telphone; private String registerType; private String thirdPartyId; //getter、setter
public class UserPasswordDO { private Integer id; private String encrptPassword; private Integer userId; //getter、setter
VO(View Object视图对象),用于前端展示。Model中包含了用户的密码数据,不应该通过Controller层返回给前端,这是不安全的操作。在Controller层通过VO返回部分可以展示到前端的数据即可。
public class UserModel { private Integer id; private String name; private Boolean gender; private Integer age; private String telphone; private String registerMode; private String thirdPartyId; private String encrptPassword; //getter、setter
public class UserVO { private Integer id; private String name; private Boolean gender; private Integer age; private String telphone; //getter、setter
dao层:定义XXXMapper接口、对应的XXXMapper.xml在resource目录下的mapper文件夹里,使用数据模型DO(Data Object)
service层:定义XXXService接口、实现类XXXServiceImpl、领域模型Model
@Service public class UserServiceImpl implements UserService { ? @Autowired private UserDOMapper userDOMapper; @Autowired private UserPasswordDOMapper userPasswordDOMapper; ? @Override public UserModel getUserById(Integer id) { UserDO userDO = userDOMapper.selectByPrimaryKey(id); if (userDO == null) { return null; } UserPasswordDO userPasswordDO = userPasswordDOMapper.selectByUid(userDO.getId()); return covertFromDataObject(userDO, userPasswordDO); } ? private UserModel covertFromDataObject(UserDO userDO, UserPasswordDO userPasswordDO) { if (userDO == null) { return null; } UserModel userModel = new UserModel(); BeanUtils.copyProperties(userDO, userModel); if (userPasswordDO != null) { userModel.setEncrptPassword(userPasswordDO.getEncrptPassword()); } return userModel; } }
controller层:定义XXXController类、视图模型VO(View Object)
@RestController("user")
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
?
    @RequestMapping("/get")
    public UserVO getUser(@RequestParam(name = "id") Integer id){
        UserModel userModel = userService.getUserById(id);
        //将核心的领域模型对象转化为可供UI使用的VO
        return convertFromModel(userModel);
    }
?
    private UserVO convertFromModel(UserModel userModel){
        if(userModel == null){
            return null;
        }
        UserVO userVO = new UserVO();
        BeanUtils.copyProperties(userModel, userVO);
        return userVO;
    }
}
定义一个公共的返回值类型
public class CommonReturnType { //处理结果 success/fail //fail 返回通用的错误码格式 //success 返回数据 private String status; private Object data; ? public static CommonReturnType create(Object result, String status) { CommonReturnType returnType = new CommonReturnType(); returnType.setStatus(status); returnType.setData(result); return returnType; } ? public static CommonReturnType create(Object result) { return CommonReturnType.create(result, "success"); } ? 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; } }
在Controller层返回CommonResultType
@RequestMapping("/get")
public CommonReturnType getUser(@RequestParam(name = "id") Integer id){
    UserModel userModel = userService.getUserById(id);
    //将核心的领域模型对象转化为可供UI使用的VO
    UserVO userVO =  convertFromModel(userModel);
    //返回通用对象
    return CommonReturnType.create(userVO);
}
前端得到的返回正确的结果
{
    "status":"success",
    "data":{
        "id":1,
        "name":"张三",
        "gender":false,
        "age":12,
        "telphone":"123456"
    }
}
异常结果的处理(见下一Part)
定义一个公共错误接口/error
public interface CommonError { public int getErrCode(); public String getErrMsg(); public CommonError setErrMsg(String errMsg); }
定义一个枚举错误类/error
public enum EmBusinessError implements CommonError { //通用错误类型 00001 PARAMETER_VALIDATION_ERROR(00001,"参数不合法"), //用户信息相关 1000X 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 errMsg) { this.errMsg = errMsg; return this; } }
定义异常包装类/exception
//包装器业务异常类的实现 public class BusinessException extends Exception implements CommonError { private CommonError commonError; ? //直接接收EmBusinessError的传参用于构造业务异常 public BusinessException(CommonError commonError){ super(); 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 errMsg) { this.commonError.setErrMsg(errMsg); return this; } }
在Controller层抛出异常
@RequestMapping("/get")
public CommonReturnType getUser(@RequestParam(name = "id") Integer id) throws BusinessException {
    UserModel userModel = userService.getUserById(id);
    if(userModel == null){
        throw new BusinessException(EmBusinessError.USER_NOT_EXIST);
    }
    //将核心的领域模型对象转化为可供UI使用的VO
    UserVO userVO =  convertFromModel(userModel);
    //返回通用对象
    return CommonReturnType.create(userVO);
}
定义exceptionHandler解决未被Controller层吸收的exception
@ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.OK) public Object handlerException(HttpServletRequest request, Exception ex){ BusinessException businessException = (BusinessException) ex; 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; }
前端得到的JSON数据
{"status":"fail",
 "data":{
     "errCode":10001,
     "errMsg":"用户不存在"
 }
}
优化异常处理,定义BaseController,其余Controller继承基类。
@RestController public class BaseController { @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.OK) public Object handlerException(HttpServletRequest request, Exception ex){ Map<String, Object> responseData = new HashMap<>(); if(ex instanceof BusinessException){ BusinessException businessException = (BusinessException) ex; CommonReturnType commonReturnType = new CommonReturnType(); commonReturnType.setStatus("fail"); 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"); } }
原文:https://www.cnblogs.com/xdcat/p/13228446.html