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

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内容如下&#xff1a; [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电阻篇笔记

电阻有标定值和实际值&#xff0c;关于误差的问题&#xff1a; 精密的电流、电压采样可能会用到1%的精度。如果只是做限流用途的话&#xff0c;用5%就足够。 电阻功率&#xff1a;标定值、额定值、瞬态值&#xff1a; 标定值由封装所决定&#xff0c;例如5W额定值由电路中平…...

探索Golang的微观世界:用net/trace包追踪网络操作

标题&#xff1a;探索Golang的微观世界&#xff1a;用net/trace包追踪网络操作 在Go语言的丰富生态系统中&#xff0c;net/trace包是一个强大的工具&#xff0c;它允许开发者深入网络请求的微观世界&#xff0c;洞察每一次数据的流动和操作的执行。本文将详细探讨如何使用net/…...

Unity开发抖音小游戏广告部分接入

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

World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG

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

极狐GitLab 密钥推送保护如何保护密钥信息被泄露?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…...

Qt+TSC打印机调试

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

QT 添加程序图标

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

数据结构与算法 - 贪心算法

一、贪心例子 贪心算法或贪婪算法的核心思想是&#xff1a; 1. 将寻找最优解的问题分为若干个步骤 2. 每一步骤都采用贪心原则&#xff0c;选取当前最优解 3. 因为没有考虑所有可能&#xff0c;局部最优的堆叠不一定让最终解最优 贪心算法是一种在每一步选择中都采取在当前…...

sed 一点点记忆

sed用法实例1&#xff08;我用的最多&#xff0c;超级无敌的用法&#xff09; 格式&#xff1a;/ # b 可以换成你想要的字符 sed -i //s/// 文本文件 sed -i ##s### 文本文件 sed -i bbsbbb 文本文件描述 通过正则表达式过滤你想要的行&#xff0c;替换该行的内容 1、s前面用…...

PyTorch--卷积神经网络(CNN)模型实现手写数字识别

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

前端程序员回忆工作第1年的记录总结(一)

更多详情&#xff1a;爱米的前端小笔记&#xff08;csdn~xitujuejin~zhiHu~Baidu~小红shu&#xff09;同步更新&#xff0c;等你来看&#xff01;都是利用下班时间整理的&#xff0c;整理不易&#xff0c;大家多多&#x1f44d;&#x1f49b;➕&#x1f914;哦&#xff01;你们…...

SQL Server端口设置完整详细步骤

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 前面是对SQLserver服务器一些介绍&#xff0c;不想了解的可直接点击目录跳入正题&#xff0c;谢谢&#xff01;&#xff01;&#xff01; SQL Server 是由微软公司开发的关系数据库管理系统 (RDBMS)。它主要…...

【2024】k8s集群 图文详细 部署安装使用(两万字)

目录&#x1f4bb; 一、前言二、下载依赖配置环境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 伪类和伪元素

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

某动一面——算法题

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中共享内存和内存区别

计算机科学中的内存与共享内存 在计算机科学中&#xff0c;“内存”和“共享内存”是两个不同的概念&#xff0c;但它们之间有着密切的关系。为了更好地理解这两个概念及其相互关系&#xff0c;我们可以分别解释一下&#xff1a; 内存 (Memory) 内存通常指的是计算机系统的主…...

JavaWeb04-MyBatis与Spring结合

目录 前言 一、MyBatis入门&#xff08;MyBatis官网&#xff09; 1.1 创建mybatis项目&#xff08;使用spring项目整合式方法&#xff09; 1.2 JDBC 1.3 数据库连接池 1.4 实用工具&#xff1a;Lombok 二、MyBatis基础操作 2.1 准备工作 2.2 导入项目并实现操作 2.3 具…...

Mybatis-springBoot

MyBatis 是一个流行的 Java 持久层框架&#xff0c;它简化了与关系型数据库的交互。通过将 SQL 语句与 Java 代码进行映射&#xff0c;MyBatis 提供了一种方便、灵活的方式来执行数据库操作。它支持动态SQL、缓存机制和插件扩展&#xff0c;使得开发人员能够更高效地编写和管理…...

如何在5分钟内实现游戏手柄控制PC:Gopher360终极指南

如何在5分钟内实现游戏手柄控制PC&#xff1a;Gopher360终极指南 【免费下载链接】Gopher360 Gopher360 is a free zero-config app that instantly turns your Xbox 360, Xbox One, or even DualShock controller into a mouse and keyboard. Just download, run, and relax. …...

【SpringBoot 3.x 第202节】微服务拆分方法论:什么时候该拆,什么时候不该拆?

&#x1f3c6;本文收录于《滚雪球学SpringBoot 3.x》&#xff0c;专门攻坚指数提升&#xff0c;本年度国内最系统最专业最详细&#xff08;永久更新&#xff09;。    该专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容&#xff0c;&#x1f680;均为全网独家首发…...

VideoDownloadHelper:智能视频下载解决方案,轻松保存网页视频资源

VideoDownloadHelper&#xff1a;智能视频下载解决方案&#xff0c;轻松保存网页视频资源 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 在当…...

CAN总线电压测试避坑指南:用示波器实测显性/隐性电平,别再被CAN_H和CAN_L的命名误导了

CAN总线电压测试实战手册&#xff1a;从示波器设置到波形解读的完整指南 实验室里&#xff0c;工程师小王盯着示波器屏幕上跳动的波形皱起了眉头——按照教科书上的说法&#xff0c;CAN_H电压应该始终高于CAN_L&#xff0c;但眼前的波形却显示在总线空闲时CAN_L电压反而更高。这…...

基于RK3576开发板的人脸检测算法部署实战:从环境搭建到性能优化

1. 项目概述与核心价值最近在做一个嵌入式视觉项目&#xff0c;需要在一块性能与功耗平衡的板子上跑实时人脸检测。经过一番选型&#xff0c;最终锁定了瑞芯微的RK3576开发板。这板子集成了NPU&#xff0c;对于跑轻量级神经网络模型来说&#xff0c;性价比相当不错。人脸检测作…...

AI时代软件工程教育:同理心融入技术课程的教学实践

1. 项目概述&#xff1a;当代码遇见人心最近几年&#xff0c;我一直在高校和培训机构里讲授软件工程相关的课程&#xff0c;从传统的软件生命周期、设计模式&#xff0c;到如今火热的敏捷开发、DevOps。一个越来越强烈的感受是&#xff1a;我们的技术教育&#xff0c;似乎正在与…...

《Sysinternals实战指南》ZoomIt 学习笔记(11.9):绘图模式——演示时“手写板”:标注、圈画、临时白板

&#x1f525;个人主页&#xff1a;杨利杰YJlio❄️个人专栏&#xff1a;《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》&#x1f31f; 让复杂的事情更…...

ElevenLabs广西话输出突然失真?一文定位3类隐藏错误:声母浊化丢失、入声韵尾截断、连读变调失效

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs广西话语音输出失真现象概览 ElevenLabs 作为当前主流的AI语音合成平台&#xff0c;其多语言支持能力广受开发者青睐。然而&#xff0c;在针对广西话&#xff08;粤语勾漏片与邕浔片混合变体…...

别再只用Graphics2D了!5个Java图片缩放方案实战评测:从Thumbnailator到OpenCV,谁画质最好?

别再只用Graphics2D了&#xff01;5个Java图片缩放方案实战评测&#xff1a;从Thumbnailator到OpenCV&#xff0c;谁画质最好&#xff1f; 当你在Java项目中需要处理用户上传的图片时&#xff0c;是否也遇到过这样的困扰&#xff1a;用Graphics2D简单缩放后&#xff0c;图片变得…...

Keil C51中使用DEFINE指令动态包含头文件技巧

1. 使用DEFINE指令指定#include文件的背景与需求在嵌入式C语言开发中&#xff0c;我们经常遇到需要根据不同的硬件平台或编译环境包含不同头文件的情况。传统做法是直接硬编码#include语句中的文件名&#xff0c;但这种方式缺乏灵活性&#xff0c;特别是在跨平台开发或需要频繁…...