当前位置: 首页 > news >正文

看看人家写的,Controller太优雅了~【送源码】

今天咱们来聊聊如何写出优雅的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);@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中充满了手动的字段校验和异常处理,让代码看起来又长又杂。显然,这种实现方式并不理想。

优雅的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);@Autowiredprivate UserService userService;@Autowiredprivate 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——


福利:

扫码回复【酒店】可免费领取酒店管理系统源码


http://www.mrgr.cn/news/4858.html

相关文章:

  • MyBatis批量插入
  • 通过proxy和普通模式实现单例
  • HTML+JS谁是卧底游戏
  • Leetcode面试经典150题-300.最长递增子序列
  • C程序设计——运算符0
  • 掌握ThinkPHP6中的数据验证技巧,提升开发效率
  • uniapp快速回顾,新学websocket连接和BLE连接
  • 计算机网络参考模型
  • Ps:首选项 - 界面
  • 【鸿蒙学习】HarmonyOS应用开发者高级认证 - 应用性能优化一(界面层面)
  • R语言基于DeepTime进行时间尺度古生物与地质分析
  • 开源自动化测试工具MeterSphere
  • 探索CSS的:future-link伪类:选择指向未来文档的链接
  • SpringBoot获取不到Nacos配置信息报错,Nacos鉴权
  • 设计模式(3)结构型模式
  • leetcode977:有序数组的平方
  • flink 消费 kafka subtask 分区策略
  • [sqlserver][sql]将一个字符串按照分隔符进行分割
  • Nvidia AI 发布 Llama-Minitron 3.1 4B:通过修剪和提炼 Llama 3.1 8B 构建的新语言模型
  • WPF 怎么样使用缓存