狗屎的 controller控制层
@RestController @RequestMapping("/user/test") public class UserController { private static Logger logger = LoggerFactory.getLogger(UserController.class); @Autowired private UserService userService; @Autowired private AuthService authService; @PostMapping public CommonResult userRegistration(@RequestBody UserVo userVo) { if (StringUtils.isBlank(userVo.getUsername())){ return CommonResult.error("用户名不能为空"); } if (StringUtils.isBlank(userVo.getPassword())){ return CommonResult.error("密码不能为空"); } logger.info("注册用户:{}" , userVo.getUsername()); try { userService.registerUser(userVo.getUsername()); return CommonResult.ok(); }catch (Exception e){ logger.error("注册用户失败:{}", userVo.getUsername(), e); return CommonResult.error("注册失败"); } } @PostMapping("/login") @PermitAll @ApiOperation("使用账号密码登录") public CommonResult<AuthLoginRespVO> login(@RequestBody AuthLoginReqVO reqVO) { if (StringUtils.isBlank(reqVO.getUsername())){ return CommonResult.error("用户名不能为空"); } if (StringUtils.isBlank(reqVO.getPassword())){ return CommonResult.error("密码不能为空"); } try { return success(authService.login(reqVO)); }catch (Exception e){ logger.error("注册用户失败:{}", reqVO.getUsername(), e); return CommonResult.error("注册失败"); } } }
优雅的controller
@RestController @RequestMapping("/user/test") public class UserController1 { private static Logger logger = LoggerFactory.getLogger(UserController1.class); @Autowired private UserService userService; @Autowired private AuthService authService; @PostMapping("/userRegistration") public CommonResult userRegistration(@RequestBody @Valid UserVo userVo) { userService.registerUser(userVo.getUsername()); return CommonResult.ok(); } @PostMapping("/login") @PermitAll @ApiOperation("使用账号密码登录") public CommonResult<AuthLoginRespVO> login(@RequestBody @Valid AuthLoginReqVO reqVO) { return success(authService.login(reqVO)); } }
校验方式
这个 if 校验看得我难受。给我写一个断言吧。Assert.notNull(userVo.getUsername(), "用户名不能为空");
这不香吗?确实不香。
使用 spring 提供的@Valid
在入参时使用@Valid注解,并且在 vo 中使用校验注解,如AuthLoginReqVO
@ApiModel(value = "管理后台 - 账号密码登录 Request VO")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AuthLoginReqVO {
@ApiModelProperty(value = "账号", required = true, example = "user")
@NotEmpty(message = "登录账号不能为空")
@Length(min = 4, max = 16, message = "账号长度为 4-16 位")
@Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母")
private String username;
@ApiModelProperty(value = "密码", required = true, example = "password")
@NotEmpty(message = "密码不能为空")
@Length(min = 4, max = 16, message = "密码长度为 4-16 位")
private String password;
}
全局异常处理
- 这个全局异常处理,可以根据自己的异常,自定义异常处理,并设置一个兜底的异常处理
@ResponseBody @RestControllerAdvice public class ExceptionHandlerAdvice { protected Logger logger = LoggerFactory.getLogger(getClass()); @ExceptionHandler(MethodArgumentNotValidException.class) public CommonResult<Object> handleValidationExceptions(MethodArgumentNotValidException ex) { logger.error("[handleValidationExceptions]", ex); StringBuilder sb = new StringBuilder(); ex.getBindingResult().getAllErrors().forEach(error -> { String fieldName = ((org.springframework.validation.FieldError) error).getField(); String errorMessage = error.getDefaultMessage(); sb.append(fieldName).append(":").append(errorMessage).append(";"); }); return CommonResult.error(sb.toString()); } /** * 处理系统异常,兜底处理所有的一切 */ @ExceptionHandler(value = Exception.class) public CommonResult<?> defaultExceptionHandler(Throwable ex) { logger.error("[defaultExceptionHandler]", ex); // 返回 ERROR CommonResult return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMsg()); } }