@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 { // 堆代码 duidaima.com 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)); } }代码量直接减一半呀,这还不算上有些直接把业务逻辑写在 controller 的,看到这些我真的直接吐血
@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; }@Valid
5.@Validated与@Valid的区别: @Validated 是 @Valid 的变体。通过声明实体中属性的 groups ,再搭配使用 @Validated ,就能决定哪些属性需要校验,哪些不需要校验。
@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()); } }就这么多,搞定,这样就拥有了漂亮优雅的 controller 了。