看看人家写的,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。

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

MacOS上VScode配置PlatformIO Core的疑难杂症与提速实战 本文详细解析了在MacOS上使用VScode配置PlatformIO Core时遇到的安装卡死、新建项目缓慢等常见问题,并提供了官方脚本安装、网络优化、命令行预下载等实用解决方案。通过环境变量配置和镜像源加速,大幅提升开发效率,特别适合ESP32等嵌入式开发场景。 阅读详情

相关推荐

⭐️白嫖的阿里云认证⭐️ 【真题&参考答案】:大模型Clouder认证:利用大模型提升内容生产能力

【摘要】真题「大模型Clouder认证:利用大模型提升内容生产能力」

davidkorhenn的博客 1934

编写优雅的Controller

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

七慎的博客 726

Unity中的坐标系及其转换方法

Unity中的坐标系及其转换方法 Unity中有四种坐标系: 1.全局坐标系 World Coordinate System 全局坐标系是用于描述场景内所有物体位置的方向的基准,也称为世界坐标系,Unity中创建的物体都是以全局坐标系中的坐标原点(0,0,0),来确定各自的位置的,可以使用transform.position来获取游戏对象的世界坐标。 2.局部坐标系 Local Coordinate System 局部坐标系也称为模型坐标系或物体坐标系,每个物体都有自身独立的物体坐标系。当物体移动或改变方向

Z_hongli的博客 8179

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

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

架构师专栏 1508

CSI Tools 工具的安装 Intel 5300 + Ubuntu14.04

在 ubuntu14 系统上面安装 CSI Tools,2020最新教程,亲测可用,只要保证和我做法一致绝对可以安装好。

WS的小屋 1万+

STM32F103C8T6心电采集实战:从PCB设计到上位机开发的完整指南(附TI杯开源资料)

本文详细介绍了基于STM32F103C8T6的心电采集系统开发全流程,从PCB设计到上位机开发,特别适合大学生电子设计大赛参赛者参考。内容涵盖硬件设计精要、软件算法优化及上位机开发技巧,并附TI杯开源资料,帮助开发者低成本实现医疗级心电信号采集。

kafka6courier的博客 194

如何优雅的处理controller

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

seeyouagain_的博客 1429

51单片机定时器的原理、应用与编程实现

本文系统介绍了51单片机定时器的基本原理与应用。首先阐述了定时器的工作原理,包括定时模式和计数模式的区别。然后详细讲解了定时器的四种工作模式(方式0-方式3)及其适用场景,并分析了相关寄存器(TMOD、TCON、THx/TLx)的功能设置。文章还给出了定时器编程的具体步骤,包括初始化、计数初值计算和示例代码。最后通过LED闪烁、PWM波形产生、脉冲计数等实际应用案例,展示了定时器的多样化应用。掌握这些知识对嵌入式系统开发具有重要意义。

2501_91227323的博客 1524

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

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

kfashfasf的博客 786

环境科研人必备:手把手教你用EPISuite 4.1批量预测化合物毒性(附ECOSAR实战)

本文详细介绍了EPISuite 4.1在环境毒理学研究中的应用,重点解析了ECOSAR模块的化合物毒性预测技术。通过批量处理实战和科研案例,帮助环境科研人员快速评估化学物质对水生生态系统的风险,提升工作效率。文章还涵盖了EPISuite核心模块的功能分类及ECOSAR模型的技术原理与算法特点。

weixin_28738165的博客 543

可信数据空间:可信空间、区域功能节点、业务功能节点、连接器的关联关系

可信数据空间通过分层架构实现安全数据共享:可信空间作为顶层制定全局规则;区域功能节点协调辖区内功能节点协作;功能节点提供具体数据服务;连接器作为唯一通信通道确保安全交互。系统采用"规则自上而下约束,数据自下而上流动"机制,通过分层治理和标准化连接,在保证数据主权的同时实现跨域协作,具有策略分级执行、去中心化治理等特性,支持灵活扩展业务场景。

友莘居士的博客 1687

【禁止血压飙升】如何拥有一个优雅的 Controller?

见过几千行代码的 controller吗?我见过。见过全是 try catch 的 controller 吗,我见过。见过全是字段校验的 controller 吗,我见过。见过全是业务代码的 controller 吗?不好意思,我们公司很多业务写在 controller 的。看见这些我真的血压高。不是很明白为什么有些喜欢在 controller 写业务逻辑的,曾经有个同事问我(就是喜欢在 controller 写业务的),你这个接口写在那里,我需要调一下你这个接口。我满脸问号??

Wewe的博客 902

OData Request:Create Entity 在 ABAP OData Client Proxy 中的工程化实践

文章摘要 本文针对具备 SAP Gateway 与 ABAP 开发经验的读者,详细讲解如何通过 ABAP OData Client Proxy 实现 OData 服务的 Create 操作。首先对比了 OData V2 与 V4 的 Create 规范差异,强调键、集合 URL 和请求体的标准化要求。随后介绍了 ABAP Client Proxy 的编程模型,包括 Client Proxy、Entity List Resource 和 Create Request/Response 三个核心对象,并提供了完

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 247

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

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

weixin_39881167的博客 4107

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

如何优雅的写 Controller 层代码?

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

芋艿V 311

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

2501_93078354的博客 895

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

weixin_39623271的博客 2294

看看这后端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
上一篇: 超级截屏 !!! eSearch,截图界的瑞士军刀!
下一篇: 再见百度网盘,我有ZFile了!!
架构文摘JGWZ
博客等级 码龄5年 8808粉丝 345原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值