禁止血压飙升!阿里大佬写的Controller太优雅了~
😰那些让人血压飙升的Controller
一个不优雅的Controller
@RestController@RequestMapping("/user/test")public class UserController {private static Logger logger = LoggerFactory.getLogger(UserController.class);@Autowiredprivate UserService userService;@Autowiredprivate AuthService authService;@PostMappingpublic 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("注册失败");}}}
优雅的Controller编写技巧
1. 使用Spring的@Valid注解进行校验
@RestController@RequestMapping("/user/test")public class UserController {private static Logger logger = LoggerFactory.getLogger(UserController.class);@Autowiredprivate UserService userService;@Autowiredprivate AuthService authService;@PostMapping("/userRegistration")public CommonResult userRegistration(@RequestBody @Valid UserVo userVo) {userService.registerUser(userVo.getUsername());return CommonResult.ok();}}
2. 实体类中的参数校验注解
@ApiModel(value = "管理后台 - 账号密码登录 Request VO")@Data@NoArgsConstructor@AllArgsConstructor@Builderpublic 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;}
3. 全局异常处理
@ResponseBody@RestControllerAdvicepublic 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);return CommonResult.error("系统错误,请稍后重试");}}
Controller的职责与界限
结束语
目前,对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
资料包含了《IDEA视频教程》、《最全python面试题库》、《最全项目实战源码及视频》及《毕业设计系统源码》,总量高达650GB。全部免费领取!全面满足各个阶段程序员的学习需求。