Jfinal与hibernate-validator实现后台表单
一. pom.xml配置
jfianl maven项目基础上增加
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>${hibernate-validator.version}</version></dependency><dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version></dependency>
二.代码要求
1.根据表结构生成java Model
@Data
public class Demo {@Size(min = 0,max = 40,message = "ID长度不能超40!")public String id;@NotBlank(message = "名称不能为空!")@Size(min = 0,max = 40,message = "名称长度不能超40!")public String name;@NotBlank(message = "备注不能为空!")@Size(min = 0,max = 200,message = "备注长度不能超200!")public String remark;@TableColumn(exist = false) //这个是自己添加的注解过滤非数据库字段public int sort;
}
2.集成重写拦截器
public class ParamValidateInterceptor implements Interceptor {private static Validator validator = null;public ParamValidateInterceptor(){ValidatorFactory factory = Validation.buildDefaultValidatorFactory();validator = factory.getValidator();}@Overridepublic void intercept(Invocation inv) {// 获取方法参数数组Parameter[] params = inv.getMethod().getParameters();for (int i = 0; i < params.length; i++) {Parameter parameter = params[i];// 判断参数Valid valid = parameter.getAnnotation(Valid.class);if (valid == null) { continue; }Object object = inv.getArg(i);Set<ConstraintViolation<Object>> set = validator.validate(object);// 没有错误继续下一次循环if (set.isEmpty()) { continue; }// 校验错误信息返回ConstraintViolation<Object> v = set.stream().findFirst().get();AjaxResult ret = AjaxResult.error(v.getMessage());// 返回错误jsoninv.getController().renderJson(ret);return;}inv.invoke();}
}
3.controller中的保存方法保存,使用jfinal中获取参数方式
//controller中方法
public void save(@Valid Demo demo) {renderJson(demoService.save(demo));
}//抽出的Service方法public AjaxResult save(Demo demo) {Record rec = new ModelToRecord<Demo>().modelTo(Demo.class, demo);rec.remove("create"); //这里可以删除Record中无用字段String id = demo.getId();Record record = getData(id); //查重是编辑还是新增boolean isedit = true;if (record == null) {isedit = false;record = new Record();record.set("id", IdUtil.fastUUID());record.set("create_time", DateUtils.getNowDate());}record.setColumns(rec);record.set("update_time", DateUtils.getNowDate());if (DbUtils.save("demo", "id", record, isedit)) {return success("保存成功!");} else {return error("保存失败!");}}//ModelToRecord.java
public class ModelToRecord<T> {/**** @param model 样式* @param data 数据* @return*/public Record modelTo(Class<T> model, Object data){String jsonStr = JSON.toJSONString(data);JSONObject jsonObject=JSON.parseObject(jsonStr);Field[] fields = model.getDeclaredFields();//判断处理标注字段情况TableColumn tbcolumn = model.getAnnotation(TableColumn.class);boolean exist=true;if(tbcolumn!=null){exist=tbcolumn.exist();}Record record=new Record();for (Field field:fields) {String key=field.getName();String typeName = field.getType().getTypeName();if(jsonObject.get(key)!=null){if(typeName.contains("String")){if(!jsonObject.getString(key).equals("")&&exist==true){record.set(key,jsonObject.get(key));}}else if(typeName.contains("Date")&&exist==true){record.set(key,jsonObject.getDate(key));}else{if(!jsonObject.getString(key).equals("")&&exist==true){record.set(key,jsonObject.get(key));}}}/*else{record.set(key,null);}*/}return record;}}
4.如果有特殊处理不在方法中使用@Valid去拦截参数
//单独验证 方法 ValidateUtils.java
public class ValidateUtils {/*** 校验参数** @param voObject* @return*/public static AjaxResult validateParams(Object voObject) {ValidatorFactory factory = Validation.buildDefaultValidatorFactory();Validator validator = factory.getValidator();Set<ConstraintViolation<Object>> violations = validator.validate(voObject);if (violations.size() > 0) {List<String> msgList = new ArrayList<>();for (ConstraintViolation<Object> violation : violations) {msgList.add(violation.getMessage());}return AjaxResult.error(msgList.toArray()[0].toString());} else {return null;}}/*** 分组校验参数** @param voObject* @return*/public static AjaxResult validateParams(Object voObject, Class<?>... groupClass) {ValidatorFactory factory = Validation.buildDefaultValidatorFactory();Validator validator = factory.getValidator();Set<ConstraintViolation<Object>> violations = validator.validate(voObject, groupClass);if (violations.size() > 0) {List<String> msgList = new ArrayList<>();for (ConstraintViolation<Object> violation : violations) {msgList.add(violation.getMessage());}return AjaxResult.error(msgList.toArray()[0].toString());} else {return null;}}
}//独立使用验证,这个基本是在上传附件上应用,也是在controller中的保存
public void save() {UploadFile file=getFile("file");//这里上传附件 enctype="multipart/form-data"// 无法ParamValidateInterceptor直接进行参数拦截验证,// 只能单独获取参数进行验证数据Demo data = getBean(Demo.class); //jfinal 使用getBean获取java ModelString img="";if(file!=null){Record recordFile = UploadFileService.uploadFile(getResponse(),getRequest(),file,"demo"); //自己的上传附件类img=recordFile.getStr("furl");data.setImg_src(img);}AjaxResult ajaxResult= ValidateUtils.validateParams(data); //验证数据if(ajaxResult==null){renderJson(demoService.save(data));}else{renderJson(ajaxResult);}}
前端参数
<!-- form中的name值需要处理,参照jfianl官网 -->
<div class="form-group"><label class="col-sm-2 control-label is-required">名称:</label><div class="col-sm-4"><input name="demo.name" class="form-control" type="text"required></div><label class="col-sm-2 control-label is-required">备注:</label><div class="col-sm-4"><input name="demo.remark" class="form-control" type="text"required></div></div>
这样就可以实现jfianl+hibernate-validator后台验证
相关文章:
Jfinal与hibernate-validator实现后台表单
一. pom.xml配置 jfianl maven项目基础上增加 <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>${hibernate-validator.version}</version></dependency><dependency…...
ansible playbook使用jinja2语法渲染inventory下的主机名和IP到/etc/hosts
1. ansible inventory 下面的 hosts内容如下: [all_host] app1 ansible_host10.2.162.147 app2 ansible_host10.2.162.148 app3 ansible_host10.2.162.149 app4 ansible_host10.2.162.150 app5 ansible_host10.2.162.151[nginx] app12. hosts.j2内容如下 127.0.0…...

张飞硬件1~9电阻篇笔记
电阻有标定值和实际值,关于误差的问题: 精密的电流、电压采样可能会用到1%的精度。如果只是做限流用途的话,用5%就足够。 电阻功率:标定值、额定值、瞬态值: 标定值由封装所决定,例如5W额定值由电路中平…...
探索Golang的微观世界:用net/trace包追踪网络操作
标题:探索Golang的微观世界:用net/trace包追踪网络操作 在Go语言的丰富生态系统中,net/trace包是一个强大的工具,它允许开发者深入网络请求的微观世界,洞察每一次数据的流动和操作的执行。本文将详细探讨如何使用net/…...

Unity开发抖音小游戏广告部分接入
Unity开发抖音小游戏广告部分接入 介绍环境确保开通流量主获取广告位广告部分代码测试如下总结 介绍 最近在使用Unity做抖音小游戏这块的内容,因为要接入广告,所以这里我把我接入广告的部分代码和经验分享一下。 环境确保 根据抖音官方的文档我们是先…...

World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG
World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG 魔兽世界怀旧版,80级,5人副本古达克,科技队伍(BUG队伍) 副本有两个门口 这样看,是不是觉得很怪。是的,和图1刚好相反的。 因此应该翻转180…...

极狐GitLab 密钥推送保护如何保护密钥信息被泄露?
极狐GitLab 是 GitLab 在中国的发行版,专门面向中国程序员和企业提供企业级一体化 DevOps 平台,用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规,而且所有的操作都是在一个平台上进行,省事省心省钱。可以一键安装极狐GitL…...

Qt+TSC打印机调试
前言 最近被TSC打印机整的死去活来,记录一下使用方法。 一、环境 Qt5.15.2 mingw tsc TE244 二、使用步骤 1.引入库 从官网下载windows C SDK,引入库,以下是.pro文件 QT core gui printsupportgreaterThan(QT_MAJOR_VERSION, 4)…...

QT 添加程序图标
1. 使用免费网站将其他图片格式转化成ico格式 Ico转换器 : https://cn.free-converter.com/ico-converter 2.qmake项目添加程序图标 在.pro文件内添加语句,如下图 RC_ICONS favicon.ico2.1 程序图标文件添加到项目目录内 2.2 通过windeployqt xxx.exe构建生成的…...

数据结构与算法 - 贪心算法
一、贪心例子 贪心算法或贪婪算法的核心思想是: 1. 将寻找最优解的问题分为若干个步骤 2. 每一步骤都采用贪心原则,选取当前最优解 3. 因为没有考虑所有可能,局部最优的堆叠不一定让最终解最优 贪心算法是一种在每一步选择中都采取在当前…...
sed 一点点记忆
sed用法实例1(我用的最多,超级无敌的用法) 格式:/ # b 可以换成你想要的字符 sed -i //s/// 文本文件 sed -i ##s### 文本文件 sed -i bbsbbb 文本文件描述 通过正则表达式过滤你想要的行,替换该行的内容 1、s前面用…...

PyTorch--卷积神经网络(CNN)模型实现手写数字识别
文章目录 前言完整代码代码解析1. 导入必要的库2. 设备配置3. 超参数设置4. 加载MNIST数据集5. 创建数据加载器6. 定义卷积神经网络模型7. 实例化模型并移动到设备8. 定义损失函数和优化器9. 训练模型10. 测试模型11. 保存模型 常用函数解析小改进数据集部分可视化训练过程可视…...

前端程序员回忆工作第1年的记录总结(一)
更多详情:爱米的前端小笔记(csdn~xitujuejin~zhiHu~Baidu~小红shu)同步更新,等你来看!都是利用下班时间整理的,整理不易,大家多多👍💛➕🤔哦!你们…...

SQL Server端口设置完整详细步骤
大家好,我是程序员小羊! 前言: 前面是对SQLserver服务器一些介绍,不想了解的可直接点击目录跳入正题,谢谢!!! SQL Server 是由微软公司开发的关系数据库管理系统 (RDBMS)。它主要…...

【2024】k8s集群 图文详细 部署安装使用(两万字)
目录💻 一、前言二、下载依赖配置环境1、配置系统环境1.1、配置桥接网络1.1.1、parallels desktop配置1.1.2、VMware配置 1.2、配置root用户登陆 2、环境配置安装下载2.1、安装ipset和ipvsadm2.2、关闭SWAP分区 3、配置Containerd容器3.1、下载安装Containerd3.2、创…...

CSS 伪类和伪元素
也是选择器的一种,被称为伪类和伪元素。这一类选择器的数量众多,通常用于很明确的目的。 伪类 什么是伪类 伪类是选择器的一种,它用于选择处于特定状态的元素。 比如当它们是这一类型的第一个元素时(:first-child)&…...

某动一面——算法题
function restoreIpAddresses(s) {const result = [];function backtrack(start, path) {// 如果剩余的字符数不符合IP地址的要求,则剪枝if (s.length - start > (4 - path.length) * 3) return;if (s.length - start < (4 - path.length)) return;// 当找到了四段IP地址…...
kubernetes中共享内存和内存区别
计算机科学中的内存与共享内存 在计算机科学中,“内存”和“共享内存”是两个不同的概念,但它们之间有着密切的关系。为了更好地理解这两个概念及其相互关系,我们可以分别解释一下: 内存 (Memory) 内存通常指的是计算机系统的主…...

JavaWeb04-MyBatis与Spring结合
目录 前言 一、MyBatis入门(MyBatis官网) 1.1 创建mybatis项目(使用spring项目整合式方法) 1.2 JDBC 1.3 数据库连接池 1.4 实用工具:Lombok 二、MyBatis基础操作 2.1 准备工作 2.2 导入项目并实现操作 2.3 具…...

Mybatis-springBoot
MyBatis 是一个流行的 Java 持久层框架,它简化了与关系型数据库的交互。通过将 SQL 语句与 Java 代码进行映射,MyBatis 提供了一种方便、灵活的方式来执行数据库操作。它支持动态SQL、缓存机制和插件扩展,使得开发人员能够更高效地编写和管理…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...