一. 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();
}
@Override
public 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());
// 返回错误json
inv.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();
Record record=new Record();
for (Field field:fields) {
//判断处理标注字段情况
TableColumn tbcolumn = field.getAnnotation(TableColumn.class);
boolean exist=true;
if(tbcolumn!=null)
{
exist=tbcolumn.exist();
}
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 Model
String 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后台验证