当前位置: 首页 > 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——


福利:

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2-SAT,用连通分量编号确定答案
  • 大模型在企业数智化转型中可以做哪些事情?
  • C++类的六个默认函数
  • 软件测试 - 基础(软件测试的生命周期、测试报告、bug的级别、与开发人员产生争执的调解方式)
  • 第二十七节、人物可互动标识
  • 从就业出发,深度剖析大数据行业的现状与前景
  • 科研绘图系列:Python语言时间趋势图
  • 如何在Linux系统中放大MKV视频文件的音量
  • ios调用高德地图定位报错
  • (八)Flink Join 连接
  • shaushaushau1
  • matlab实现模拟退火算法
  • 软考-软件设计师(程序设计语言习题)
  • 苹果上架没有iphone、没有ipad也可以生成截屏
  • python编程练习1-数组
  • angular组件开发
  • avalon2.2的VM生成过程
  • EOS是什么
  • Lucene解析 - 基本概念
  • Making An Indicator With Pure CSS
  • MD5加密原理解析及OC版原理实现
  • 阿里云购买磁盘后挂载
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 基于webpack 的 vue 多页架构
  • 思维导图—你不知道的JavaScript中卷
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 协程
  • 移动端解决方案学习记录
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • python最赚钱的4个方向,你最心动的是哪个?
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (1)Nginx简介和安装教程
  • (3)STL算法之搜索
  • (C#)一个最简单的链表类
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (Ruby)Ubuntu12.04安装Rails环境
  • (七)c52学习之旅-中断
  • .gitattributes 文件
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .net core 的缓存方案
  • .NET Core 发展历程和版本迭代
  • .net core控制台应用程序初识
  • .net mvc 获取url中controller和action
  • .Net 应用中使用dot trace进行性能诊断
  • .net反编译的九款神器
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • @Builder用法
  • [2023年]-hadoop面试真题(一)
  • [④ADRV902x]: Digital Filter Configuration(发射端)
  • [Android Studio 权威教程]断点调试和高级调试