今天咱们来聊聊如何写出优雅的Controller代码。
写程序想让作品成为经典,不只是简单地加个try-catch就完事了。有时候,一个不小心,Controller里写的业务逻辑都能让你血压飙升!不过别慌,今天我就来带大家看看怎么把Controller写得优雅又高效。🎨
😰那些让人血压飙升的Controller
先说说我见过的一些Controller案例。你们见过上千行的代码塞在一个Controller里的情况吗?我见过。
这种代码,几乎每次打开都让我血压蹭蹭往上涨。还有全是try-catch块的Controller,基本上每个小错误都得手动处理,简直是一场噩梦。
更糟的是,某些业务逻辑全塞在Controller里,代码行数长得让人无从下手维护。😵
一个不优雅的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("注册失败");
}
}
}
这个Controller中充满了手动的字段校验和异常处理,让代码看起来又长又杂。显然,这种实现方式并不理想。
优雅的Controller编写技巧
如何将上面的Controller代码优化得优雅简洁呢?以下是我常用的几个小技巧:
1. 使用Spring的@Valid注解进行校验
在Spring中,@Valid注解提供了一种非常简洁的方式来进行参数校验。只需在Controller方法的参数上使用@Valid注解,并在VO类中使用一些验证注解,就可以实现字段的自动校验。
@RestController
@RequestMapping("/user/test")
public class UserController {
private static Logger logger = LoggerFactory.getLogger(UserController.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();
}
}
通过这种方式,不仅减少了代码量,也提高了可读性,让你的Controller更加干净整洁。✌️
2. 实体类中的参数校验注解
在实体类中,我们可以使用如@NotEmpty、@Length等校验注解来控制输入数据:
@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;
}
使用这些注解,可以让我们更方便地进行输入校验,并减少重复的校验代码。这样,代码就像喝了鲜榨的橙汁一样清新。
3. 全局异常处理
全局异常处理是提升代码整洁性的另一大法宝。通过@RestControllerAdvice注解,我们可以在一个地方集中处理所有异常,而不是在每个Controller中重复写try-catch块。
@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);
return CommonResult.error("系统错误,请稍后重试");
}
}
通过这种方式,我们能优雅地处理所有的校验异常和系统异常,大大提高了代码的可维护性。
Controller的职责与界限
很多时候,程序员喜欢在Controller里直接写业务逻辑,看起来是方便了,但实际上却为代码的扩展性和可维护性埋下了隐患。
🔧Controller应该专注于处理请求和返回结果,而不是成为业务逻辑的集中营。我们应该始终记住代码的职责分离原则,尽量让每个部分只做它应该做的事情。
结束语
通过使用@Valid注解、参数校验注解、全局异常处理等技巧,我们不仅可以提高代码的可读性和维护性,还能避免写出让人血压飙升的Controller。
最后,如果你也有自己的代码优化心得,欢迎来评论区和东哥分享!让我们一起交流,创造出更优雅的代码!😄
——EOF——
福利:
扫码回复【酒店】可免费领取酒店管理系统源码