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();
    }

    @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后台验证

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值