看看人家写的,Controller太优雅了~

Java后端Controller参数校验的一些干货及问题~ DTO参数对应属性上加入校验规则注解开启校验,在对应的方法参数前面加@Validated普通参数控制器类上加入@Validated注解) 阅读详情

今天咱们来聊聊如何写出优雅的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。

最后,如果你也有自己的代码优化心得,欢迎来评论区分享!让我们一起交流,创造出更优雅的代码!😄

机器学习入门指南:Jupyter Notebook实战 对于机器学习工程师而言,他们更擅长的是算法、模型、数据探索的工作,而对于工程化的能力则并不是其擅长的工作。Jupyter Notebook生成PMML文件1​​​​​​​。Jupyter Notebook生成PMML文件2​​​​​​​。PySpark Notebook建模 -折线图​​​​​​​。TensorFlowNotebook建模​​​​​​​。R Notebook建模 - 散点图​​​​​​​。PySpark Notebook建模​​​​​​​。R Notebook获取训练数据集​​​​​​​。 阅读详情

相关推荐

SAP SD核心流程解析:从销售订单到财务结算的实战指南

本文深入解析SAP SD模块从销售订单到财务结算的核心流程,重点剖析了销售订单中的行项目类别如何作为流程的“总开关”,决定了后续交货、开票及财务集成的走向。文章结合实战案例,详细拆解了正常销售、退货、第三方销售、寄售等典型流程的配置要点与国内化适配方案,并阐述了SD与财务模块集成的关键连接点,为顾问和用户提供了一份全面的实战指南。

weixin_29250403的博客 428

编写优雅的Controller

这篇笔记主要是对Controller层的处理,包括状态码、响应、参数接收、校验以及异常处理等,编写出优雅的Controller层代码。

七慎的博客 726

OLLAMA_HOST环境变量设置全攻略:从127.0.0.1到局域网共享的完整配置

本文详细解析了OLLAMA_HOST环境变量的核心作用与配置方法,指导用户如何将Ollama服务从仅限本机访问(127.0.0.1)扩展到局域网共享。文章涵盖了macOS、Linux、Windows三大平台的实战配置步骤,并提供了安全加固、性能优化及常见故障排查方案,是解决多设备协作访问本地AI模型的完整指南。

weixin_28455801的博客 1904

这才是Controller 层代码最优雅的写法,其他写法都非常Low!

写出优雅的Controller层代码需要考虑多方面的因素,包括接口设计、参数校验、异常处理、数据传输、Spring特性和日志记录等。通过遵循这些最佳实践,可以显著提高代码的可读性、可维护性和健壮性,让系统在面对复杂业务需求时依然保持良好的扩展性和可靠性。ddkk.com。

架构师专栏 1508

保姆级教学,教你在vscode和cursor上调试matlab!!!

保姆级教你如何在vscode或者cursor上面调试matlab

yang_upup的博客 2083

蓝牙配对鉴权过程深度剖析:Just Works/Numeric Comparison/Passkey Entry/OOB 协议流程

当你新买的智能手表与手机配对时,是否遇到过这样的情况:有时只需在手机上点击 "确认" 即可完成配对,有时却需要在手表上输入手机显示的 6 位数字,而连接车载蓝牙时可能又需要输入固定密码?这些差异背后,是蓝牙配对鉴权机制在默默工作。蓝牙配对鉴权是设备间建立安全连接的核心环节,直接关系到数据传输的保密性和设备身份的真实性。​

byte轻骑兵的技术小窝 3574

如何优雅的处理controller

这样也能更好的专注于业务逻辑的开发,代码简介、功能完善。前言:对于controller每个开发人员应该都很熟悉,从SSH、SSM都离不开这个,到现在的SpringBoot都有它的一席之地,通常我们都知道Controller 层的代码一般是不负责具体的逻辑业务逻辑实现,但是它负责接收和响应请求,同时也负责对外提供第三方的接口。而统一拦截异常的目的一个是为了可以与前面定义下来的统一包装返回结构能对应上,另一个是我们希望无论系统发生什么异常,Http 的状态码都要是 200 ,尽可能由业务来区分系统的异常。

seeyouagain_的博客 1429

基于STM32与FPGA的数据采集系统的设计与实现

数据采集系统在现代工程中起着至关重要的作用,用于实时获取和处理各种传感器或外部设备的数据。在本文中,我们将探讨如何基于STM32微控制器和FPGA(现场可编程门阵列)实现一个高效的数据采集系统。我们可以使用STM32的UART、SPI或I2C接口与各种传感器或外部设备进行通信,并通过GPIO口实现控制功能。在硬件连接完成后,我们可以通过STM32控制FPGA的配置和数据传输。STM32作为主控单元负责与外部设备进行通信和数据处理,而FPGA则用于高速数据采集和实时处理。具体的通信协议取决于连接的设备类型。

UbiSqlserver的博客 1797

瞧瞧别人的Controller,那叫一个优雅!

在实际工作中,我们需要经常跟第三方平台打交道,可能会对接第三方平台Controller接口,或者提供Controller接口给第三方平台调用。那么问题来了,如果设计一个优雅的Controller接口,能够满足:安全性、可重复调用、稳定性、好定位问题等多方面需求?今天跟大家一起聊聊设计Controller接口时,需要注意的一些地方,希望对你会有所帮助。

kfashfasf的博客 786

工业质检终极方案:C#上位机融合 YOLO+Blob分析(一站式尺寸测量+缺陷检测)

本次上位机界面严格遵循工业现场操作规范简洁、直观、按钮大、文字清晰、参数可视化调节,操作人员为车间工人/质检员,无需复杂操作,所有功能一目了然。所有控件均为WinForms原生控件,拖拽即可完成布局,无任何自定义控件,开发效率拉满,核心布局永久复用本次实战完成的C#上位机+YOLO+Blob融合质检方案,是工业规则零件全尺寸质检的终极落地方案,完美解决了单一检测方案的所有短板,具备以下不可替代的工业价值。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1344

不会C# Winform用户界面设计?是因为没有掌握这些控件(建议收藏)

文章目录6.1 常用控件6.1.1 单选按钮(RadioButton)6.1.2 复选框(CheckBox)6.1.3 框架1. 面板控件Panel2. 分组框GroupBox3. TabControl控件6.1.4 应用实例6. 2 列表框和组合框6.2.1 列表框(ListBox)6.2.2 组合框(ComboBox )6.2.3 应用实例6.3 用户交互界面6.3.1 滚动条和进度条6.3.2 定时器6.3.3 菜单设计菜单设计概述MenuStrip和ContextMenuSt

智慧空间实验室 2920

controller调用另一个controller_看看人家,那后端API接口写得,那叫一个优雅!

在移动互联网,分布式、微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式,(题外话:前后端的工作职责越来越明确,现在的前端都称之为大前端,技术栈以及生态圈都已经非常成熟;以前后端人员瞧不起前端人员,那现在后端人员要重新认识一下前端,前端已经很成体系了)。一般系统的大致整体架构图如下:需要说明的是,有些小伙伴会回复说,这个架构太简单了吧,太low了,什么网关啊,缓存啊,消...

weixin_39881167的博客 4107

推荐系统[九]项目技术细节讲解z2:搜索Query理解[Term Weight、Query 改写、同义词扩写]和语义召回技术

在 pooling 方法上,我们也尝试过不同层 pooling,或者在多层上增加 attention 聚合 BERT 多层结果,效果和最后一层所有 token 做 average pooling 相当。损失函数方面,在排序阶段使用pairwise比 pointwise 损失函数的效果会更好。

丨汀、的博客 1109

如何优雅的写 Controller 层代码?

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 10:33更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT ...

芋艿V 311

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

开源了,优雅的Controller,应该这样写!

参数校验声明化- 使用注解替代硬编码校验逻辑异常处理全局化- 集中处理所有异常,保持业务代码纯净数据格式化统一化- 自动处理常见的数据类型转换这种架构不仅让代码更加简洁美观,更重要的是提高了代码的可维护性和健壮性。建议在新项目中直接采用这种架构,对于老项目可以逐步重构,让代码质量得到持续提升。

2501_93078354的博客 895

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

controller调用另一个controller中的方法 获取返回值_看看人家接口写得,那叫一个优雅!...

点击上方Java后端,选择设为星标优质文章,及时送达来源:https://zhuanlan.zhihu.com/p/265318078在移动互联网,分布式、微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式,(题外话:前后端的工作职责越来越明确,现在的前端都称之为大前端,技术栈以及生态圈都已经非常成熟;以前后端人员瞧不起前端人员,那现在后端人员要重新认识一下前端,前...

weixin_39623271的博客 2294

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

看看这后端API接口写得,那真叫一个巴适~

在移动互联网,分布式、微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式,(题外话:前后端的工作职责越来越明确,现在的前端都称之为大前端,技术栈以及生态圈都已经非常成熟;以前后端人员瞧不起前端人员,那现在后端人员要重新认识一下前端,前端已经很成体系了)。 一般系统大致架构如下: 需要说明的是,有些小伙伴会回复说,这个架构太简单了吧,太low了,什么网关啊,缓存啊,消息中间件啊,都没有。因为这篇主要聊API接口,所以我们聚焦这一点。 接口交互 前端和后端进行交互,前端按照约定

AMSRY的博客 6253

controller调用另一个controller_看看别人后端API接口写得,那叫一个优雅

在分布式、微服务盛行的今天,绝大部分项目都采用的微服务框架,前后端分离方式。题外话:前后端的工作职责越来越明确,现在的前端都称之为大前端,技术栈以及生态圈都已经非常成熟;以前后端人员瞧不起前端人员,那现在后端人员要重新认识一下前端,前端已经很成体系了。一般系统的大致整体架构图如下:需要说明的是,有些小伙伴会回复说,这个架构太简单了吧,太low了,什么网关啊,缓存啊,消息中间件啊,都没有。因为老顾这...

weixin_39960319的博客 1165

从阿里跳槽来的工程师,写个后端API接口都这么优雅!那叫一个巴适~

点击关注公众号:互联网架构师,后台回复2T获取2TB学习资源!上一篇:Alibaba开源内网高并发编程手册.pdf在移动互联网,分布式微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式,(题外话:前后端的工作职责越来越明确,现在的前端都称之为大前端,技术栈以及生态圈都已经非常成熟;以前后端人员瞧不起前端人员,那现在后端人员要重新认识一下前端,前端已经很成体系了)。一般系统大致架...

emprere的博客 191

五个步骤,助你优雅的写好 Controller 层代码!

点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!每天14:00更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析作业调度中间件 Elast...

weixin_44421461的博客 499

controller调用另一个controller_看看别人后端API接口写得,那叫一个优雅!

点击上方蓝色字体,选择“设为星标”回复”666“获取面试宝典在分布式、微服务盛行的今天,绝大部分项目都采用的微服务框架,前后端分离方式。题外话:前后端的工作职责越来越明确,现在的前端都称之为大前端,技术栈以及生态圈都已经非常成熟;以前后端人员瞧不起前端人员,那现在后端人员要重新认识一下前端,前端已经很成体系了。一般系统的大致整体架构图如下:需要说明的是,有些小伙伴会回复说,这个架构太简单...

weixin_39947812的博客 1257

看看人家接口写得,那叫一个优雅!

点击上方Java后端,选择设为星标优质文章,及时送达来源:https://zhuanlan.zhihu.com/p/265318078在移动互联网,分布式、微服务盛行的今天,现在项目...

公众号:Java后端 230

看看人家那后端API接口写得,那叫一个优雅!

点击上方果汁简历,选择“置顶公众号”优质文章,第一时间送达来源:r6d.cn/tEvn在移动互联网,分布式、微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式,(题...

weixin_37097680的博客 100
上一篇: 再见百度网盘,我有ZFile了!!
下一篇: 一款轻量级的Docker日志查看器!!
架构文摘JGWZ
博客等级 码龄5年 8808粉丝 345原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值