`

利用反射 和 注解 实现javabean的验证

 
阅读更多

验证类

public class BeanValidUtil {

    /**
     * 验证参数bean(包括内部的子bean)
     * 
     * @param t
     *            参数对象 例如Fxfa
     * @param optype
     *            操作类型 枚举
     * @throws FkptServiceException
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    public static void valid(Object t, OperateType optype) throws FkptServiceException {
        try {
            // 验证主的参数bean
            validSingle(t, optype);
            // 验证主bean中的list对象
            Class cls = t.getClass();
            for (Field field : cls.getDeclaredFields()) {
                if (field.getType() == List.class) {
                    PropertyDescriptor pd = new PropertyDescriptor(field.getName(), cls);
                    Method getMethod = pd.getReadMethod();// 获得get方法
                    List<Object> list = (List<Object>) getMethod.invoke(t);
                    if (!CollectionUtils.isEmpty(list)) {
                        for (Object o : list) {
                            validSingle(o, optype);
                        }
                    }
                }
            }
        } catch (Exception e) {
            throw new FkptServiceException(e.getMessage(), e);
        }
    }

    @SuppressWarnings("rawtypes")
    public static void validSingle(Object t, OperateType optype) throws FkptServiceException {
        StringBuilder err = new StringBuilder("");
        // 获取注解信息
        BeanVaild bv = null;
        Class cls = t.getClass();
        // 检测field是否存在
        try {
            Field[] fields = cls.getDeclaredFields();
            for (Field f : fields) {
                bv = f.getAnnotation(BeanVaild.class);
                // 不为空执行校验
                if (bv != null) {
                    // 新增验证
                    if (optype == OperateType.ADD && bv.addOp()) {
                        err.append(checkType(f, bv.type(), t));
                    } else if (optype == OperateType.UPDATE && bv.updateOp()) {
                        // 更新验证
                        err.append(checkType(f, bv.type(), t));
                    }
                }
            }
            String errmsg = err.toString();
            if (!StringUtil.isNullString(errmsg)) {
                throw new FkptServiceException(errmsg);
            }
        } catch (Exception e) {
            throw new FkptServiceException(ServiceExcuteMessage.FKPT_BEAN_VALID_001, e, t.getClass().getName(),
                    e.getMessage());
        }
    }

    // 根据不同的验证类型执行验证操作
    public static StringBuilder checkType(Field field, ValidTypes type, Object t) throws Exception {
        StringBuilder err = new StringBuilder();
        switch (type) {
        case NOTNULL:
            err.append(checkNotNull(field.getName(), type, t));
            break;
        default:
            err.append("");
            break;
        }
        return err;
    }

    // 非空验证
    private static StringBuilder checkNotNull(String fieldName, ValidTypes type, Object t) throws Exception {
        PropertyDescriptor pd = new PropertyDescriptor(fieldName, t.getClass());
        Method getMethod = pd.getReadMethod();// 获得get方法
        String fieldVal = (String) getMethod.invoke(t);
        if (StringUtil.isNullString(fieldVal)) {
            return new StringBuilder("获取【" + fieldName + "】失败,该字段不能为空\n");
        } else {
            return new StringBuilder("");
        }
    }
}

注解接口

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface BeanVaild {
    /**
     * 验证类型
     */
    ValidTypes type() default ValidTypes.NOTNULL;

    /**
     * 新增操作类型
     */
    boolean addOp() default false;

    /**
     * 更新操作类型
     */
    boolean updateOp() default false;

}

  类型枚举

public enum OperateType {
    /**
     * 操作类型 新增
     */
    ADD,
    /**
     * 操作类型 更新
     */
    UPDATE
}

 

public enum ValidTypes {
    /**
     * 不能为空
     */
    NOTNULL
}

 

javabean主类

public class Fxfa extends BaseBean {

    private static final long serialVersionUID = 8239685879814948678L;

    /**
     * 方案编号
     */
    @BeanVaild(type = ValidTypes.NOTNULL, updateOp = true)
    private String fabh;

    /**
     * 方案名称
     */
    @BeanVaild(type = ValidTypes.NOTNULL, addOp = true, updateOp = true)
    private String famc;

    /**
     * 方案类型
     */
    @BeanVaild(type = ValidTypes.NOTNULL, addOp = true)
    private String falx;

    /**
     * 优先级
     */
    private String yxj;

    /**
     * 优先级名称
     */
    private String yxjMc;

    /**
     * 版本
     */
    private String bb;

    /**
     * 预警值测算方案
     */
    private String yjzcsfa;

    /**
     * 预警值测算方案名称
     */
    private String yjzcsfaMc;

    /**
     * 父方案代码,即上一版本方案代码
     */
    private String fabhF;

    /**
     * 初方案代码,即初始版本方案代码
     */
    private String fabhC;

    /**
     * 有效标志(Y、N)
     */
    @BeanVaild(type = ValidTypes.NOTNULL, addOp = true)
    private String yxbz;

    /**
     * 来源(1:系统自建;2:外部导入)
     */
    @BeanVaild(type = ValidTypes.NOTNULL, addOp = true)
    private String ly;

    /**
     * 制定人员代码
     */
    private String zdRyDm;

    /**
     * 制定税务机关代码
     */
    private String zdSwjgDm;

    /**
     * 制定时间
     */
    private String zdsj;

    /**
     * 修改人员代码
     */
    private String xgRyDm;

    /**
     * 修改税务机关代码
     */
    private String xgSwjgDm;

    /**
     * 修改时间
     */
    private String xgsj;

    /**
     * 关键词
     */
    private String gjc;

    /**
     * 说明
     */
    private String sm;

    /**
     * 纳税评估项目ID
     */
    private String nspgxmid;

    /**
     * 纳税评估项目MC
     */
    private String nspgxmmc;

    /**
     * 系统代码
     */
    private String xtdm;

    /**
     * 分析模型列表
     */
    private List<FxfaFxmxXx> lstFxmxXx = new ArrayList<FxfaFxmxXx>();

    /**
     * 指标元条件
     */
    private List<FxfaZbyTj> lstZbyTj = new ArrayList<FxfaZbyTj>();

    /**
     * 维度条件列表
     */
    private List<FxfaWdTj> lstWdTj = new ArrayList<FxfaWdTj>();

    /**
     * @return the lstZbyTj
     */
    public List<FxfaZbyTj> getLstZbyTj() {
        return lstZbyTj;
    }

    /**
     * @param lstZbyTj
     *            the lstZbyTj to set
     */
    public void setLstZbyTj(List<FxfaZbyTj> lstZbyTj) {
        this.lstZbyTj = lstZbyTj;
    }

    /**
     * @return the lstWdTj
     */
    public List<FxfaWdTj> getLstWdTj() {
        return lstWdTj;
    }

    /**
     * @param lstWdTj
     *            the lstWdTj to set
     */
    public void setLstWdTj(List<FxfaWdTj> lstWdTj) {
        this.lstWdTj = lstWdTj;
    }

    /**
     * @return the fabh
     */
    public String getFabh() {
        return fabh;
    }

    /**
     * @param fabh
     *            the fabh to set
     */
    public void setFabh(String fabh) {
        this.fabh = fabh;
    }

    /**
     * @return the famc
     */
    public String getFamc() {
        return famc;
    }

    /**
     * @param famc
     *            the famc to set
     */
    public void setFamc(String famc) {
        this.famc = famc;
    }

    /**
     * @return the falx
     */
    public String getFalx() {
        return falx;
    }

    /**
     * @param falx
     *            the falx to set
     */
    public void setFalx(String falx) {
        this.falx = falx;
    }

    /**
     * @return the yxj
     */
    public String getYxj() {
        return yxj;
    }

    /**
     * @param yxj
     *            the yxj to set
     */
    public void setYxj(String yxj) {
        this.yxj = yxj;
    }

    /**
     * @return the bb
     */
    public String getBb() {
        return bb;
    }

    /**
     * @param bb
     *            the bb to set
     */
    public void setBb(String bb) {
        this.bb = bb;
    }

    /**
     * @return the fabhF
     */
    public String getFabhF() {
        return fabhF;
    }

    /**
     * @param fabhF
     *            the fabhF to set
     */
    public void setFabhF(String fabhF) {
        this.fabhF = fabhF;
    }

    /**
     * @return the fabhC
     */
    public String getFabhC() {
        return fabhC;
    }

    /**
     * @param fabhC
     *            the fabhC to set
     */
    public void setFabhC(String fabhC) {
        this.fabhC = fabhC;
    }

    /**
     * @return the yxbz
     */
    public String getYxbz() {
        return yxbz;
    }

    /**
     * @param yxbz
     *            the yxbz to set
     */
    public void setYxbz(String yxbz) {
        this.yxbz = yxbz;
    }

    /**
     * @return the ly
     */
    public String getLy() {
        return ly;
    }

    /**
     * @param ly
     *            the ly to set
     */
    public void setLy(String ly) {
        this.ly = ly;
    }

    /**
     * @return the zdRyDm
     */
    public String getZdRyDm() {
        return zdRyDm;
    }

    /**
     * @param zdRyDm
     *            the zdRyDm to set
     */
    public void setZdRyDm(String zdRyDm) {
        this.zdRyDm = zdRyDm;
    }

    /**
     * @return the zdSwjgDm
     */
    public String getZdSwjgDm() {
        return zdSwjgDm;
    }

    /**
     * @param zdSwjgDm
     *            the zdSwjgDm to set
     */
    public void setZdSwjgDm(String zdSwjgDm) {
        this.zdSwjgDm = zdSwjgDm;
    }

    /**
     * @return the zdsj
     */
    public String getZdsj() {
        return zdsj;
    }

    /**
     * @param zdsj
     *            the zdsj to set
     */
    public void setZdsj(String zdsj) {
        this.zdsj = zdsj;
    }

    /**
     * @return the xgRyDm
     */
    public String getXgRyDm() {
        return xgRyDm;
    }

    /**
     * @param xgRyDm
     *            the xgRyDm to set
     */
    public void setXgRyDm(String xgRyDm) {
        this.xgRyDm = xgRyDm;
    }

    /**
     * @return the xgSwjgDm
     */
    public String getXgSwjgDm() {
        return xgSwjgDm;
    }

    /**
     * @param xgSwjgDm
     *            the xgSwjgDm to set
     */
    public void setXgSwjgDm(String xgSwjgDm) {
        this.xgSwjgDm = xgSwjgDm;
    }

    /**
     * @return the xgsj
     */
    public String getXgsj() {
        return xgsj;
    }

    /**
     * @param xgsj
     *            the xgsj to set
     */
    public void setXgsj(String xgsj) {
        this.xgsj = xgsj;
    }

    /**
     * @return the gjc
     */
    public String getGjc() {
        return gjc;
    }

    /**
     * @param gjc
     *            the gjc to set
     */
    public void setGjc(String gjc) {
        this.gjc = gjc;
    }

    /**
     * @return the yjzcsfa
     */
    public String getYjzcsfa() {
        return yjzcsfa;
    }

    /**
     * @param yjzcsfa
     *            the yjzcsfa to set
     */
    public void setYjzcsfa(String yjzcsfa) {
        this.yjzcsfa = yjzcsfa;
    }

    /**
     * @return the lstFxmxXx
     */
    public List<FxfaFxmxXx> getLstFxmxXx() {
        return lstFxmxXx;
    }

    /**
     * @param lstFxmxXx
     *            the lstFxmxXx to set
     */
    public void setLstFxmxXx(List<FxfaFxmxXx> lstFxmxXx) {
        this.lstFxmxXx = lstFxmxXx;
    }

    /**
     * @return the sm
     */
    public String getSm() {
        return sm;
    }

    /**
     * @param sm
     *            the sm to set
     */
    public void setSm(String sm) {
        this.sm = sm;
    }

    /**
     * @return the yjzcsfaMc
     */
    public String getYjzcsfaMc() {
        return yjzcsfaMc;
    }

    /**
     * @param yjzcsfaMc
     *            the yjzcsfaMc to set
     */
    public void setYjzcsfaMc(String yjzcsfaMc) {
        this.yjzcsfaMc = yjzcsfaMc;
    }

    /**
     * @return the yxjMc
     */
    public String getYxjMc() {
        return yxjMc;
    }

    /**
     * @param yxjMc
     *            the yxjMc to set
     */
    public void setYxjMc(String yxjMc) {
        this.yxjMc = yxjMc;
    }

    /**
     * @return 获取 nspgxmid
     */
    public String getNspgxmid() {
        return nspgxmid;
    }

    /**
     * @param nspgxmid
     *            设置 nspgxmid
     */
    public void setNspgxmid(String nspgxmid) {
        this.nspgxmid = nspgxmid;
    }

    /**
     * @return 获取 nspgxmmc
     */
    public String getNspgxmmc() {
        return nspgxmmc;
    }

    /**
     * @param nspgxmmc
     *            设置 nspgxmmc
     */
    public void setNspgxmmc(String nspgxmmc) {
        this.nspgxmmc = nspgxmmc;
    }

    /**
     * @return the xtdm
     */
    public String getXtdm() {
        return xtdm;
    }

    /**
     * @param xtdm
     *            the xtdm to set
     */
    public void setXtdm(String xtdm) {
        this.xtdm = xtdm;
    }

}

 

字bean

public class FxfaWdTj implements Serializable {

    private static final long serialVersionUID = -7624527525952631847L;

    /**
     * 方案编号
     */
    private String fabh;

    /**
     * 序号
     */
    @BeanVaild(type = ValidTypes.NOTNULL, addOp = true, updateOp = true)
    private String xh;

    /**
     * 条件名称
     */
    @BeanVaild(type = ValidTypes.NOTNULL, addOp = true, updateOp = true)
    private String tjmc;

    /**
     * 条件表
     */
    @BeanVaild(type = ValidTypes.NOTNULL, addOp = true, updateOp = true)
    private String tjb;

    /**
     * 条件字段
     */
    @BeanVaild(type = ValidTypes.NOTNULL, addOp = true, updateOp = true)
    private String tjzd;

    /**
     * 条件符
     */
    @BeanVaild(type = ValidTypes.NOTNULL, addOp = true, updateOp = true)
    private String tjf;

    /**
     * 条件值
     */
    @BeanVaild(type = ValidTypes.NOTNULL, addOp = true, updateOp = true)
    private String tjz;

    /**
     * 页面显示代码
     */
    @BeanVaild(type = ValidTypes.NOTNULL, addOp = true, updateOp = true)
    private String xsdm;

    /**
     * 页面显示名称
     */
    @BeanVaild(type = ValidTypes.NOTNULL, addOp = true, updateOp = true)
    private String xsmc;

    /**
     * @return the fabh
     */
    public String getFabh() {
        return fabh;
    }

    /**
     * @param fabh
     *            the fabh to set
     */
    public void setFabh(String fabh) {
        this.fabh = fabh;
    }

    /**
     * @return the tjmc
     */
    public String getTjmc() {
        return tjmc;
    }

    /**
     * @param tjmc
     *            the tjmc to set
     */
    public void setTjmc(String tjmc) {
        this.tjmc = tjmc;
    }

    /**
     * @return the tjb
     */
    public String getTjb() {
        return tjb;
    }

    /**
     * @param tjb
     *            the tjb to set
     */
    public void setTjb(String tjb) {
        this.tjb = tjb;
    }

    /**
     * @return the tjzd
     */
    public String getTjzd() {
        return tjzd;
    }

    /**
     * @param tjzd
     *            the tjzd to set
     */
    public void setTjzd(String tjzd) {
        this.tjzd = tjzd;
    }

    /**
     * @return the tjf
     */
    public String getTjf() {
        return tjf;
    }

    /**
     * @param tjf
     *            the tjf to set
     */
    public void setTjf(String tjf) {
        this.tjf = tjf;
    }

    /**
     * @return the tjz
     */
    public String getTjz() {
        return tjz;
    }

    /**
     * @param tjz
     *            the tjz to set
     */
    public void setTjz(String tjz) {
        this.tjz = tjz;
    }

    /**
     * @return the xsdm
     */
    public String getXsdm() {
        return xsdm;
    }

    /**
     * @param xsdm
     *            the xsdm to set
     */
    public void setXsdm(String xsdm) {
        this.xsdm = xsdm;
    }

    /**
     * @return the xsmc
     */
    public String getXsmc() {
        return xsmc;
    }

    /**
     * @param xsmc
     *            the xsmc to set
     */
    public void setXsmc(String xsmc) {
        this.xsmc = xsmc;
    }

    /**
     * @return the xh
     */
    public String getXh() {
        return xh;
    }

    /**
     * @param xh
     *            the xh to set
     */
    public void setXh(String xh) {
        this.xh = xh;
    }

}

 验证调用

// 新增
        if (StringUtil.isNullString(fxfa.getFabh())) {
            // 新增时验证参数
            BeanValidUtil.valid(fxfa, OperateType.ADD);
            fxfa.setFabh(UUIDUtil.nextVal());
            ServiceExecuteUtil.executeDao("fxpt.core.fak.fxfa.dao.insertFxfa", new Object[] {fxfa, loginuser});
        } else {
            // 修改
            // 修改时验证参数
            BeanValidUtil.valid(fxfa, OperateType.UPDATE);
            ServiceExecuteUtil.executeDao("fxpt.core.fak.fxfa.dao.updateFxfa", new Object[] {fxfa, loginuser});
        }

 

分享到:
评论

相关推荐

    JavaBean valication验证实现方法示例

    JavaBean验证实现方法示例 JavaBean 验证是 Java 语言中的一种重要机制,用于确保数据的正确性和合法性。验证的目的是为了确保数据符合预期的格式和规则,从而避免错误和异常。在 Java 中,有多种验证机制,包括 ...

    Java Bean 遍历和使用注解给Bean的属性添加属性值

    在实际开发中,遍历Java Bean和利用注解可以增强代码的可读性、可维护性和灵活性。例如,注解可以用于数据验证、持久化映射、AOP切面等。理解并熟练运用这两个概念,能让你在Java开发中更得心应手。 以上内容围绕...

    minimalcode-reflect:JavaBean 的简约反射和内省功能

    Java提供了`java.lang.annotation`包来处理注解,而`minimalcode-reflect`可能提供了一种更简洁的方式,用于在反射过程中分析和利用注解信息,比如验证Bean是否满足特定约束,或者根据注解自动生成某些逻辑。...

    java 手写SpringMVC框架

    7. **Interceptor(拦截器)**:拦截器可以对请求和响应进行预处理和后处理,比如权限验证、日志记录等。 8. **Annotation**:注解是SpringMVC中的重要工具,如`@Controller`、`@RequestMapping`、`@Service`、`@...

    Annotation(注解)详细教程,jdk新特性

    注解提供了一种方式,使得程序员可以在代码中添加元数据(metadata),这些数据不直接影响代码执行,但可以被编译器、IDE或其他工具使用,以实现各种自动化任务,如代码分析、性能优化、生成文档或验证代码约束。...

    Java annotation

    ### Java Annotation ...注解的强大之处在于其灵活性和扩展性,通过结合注解处理器等工具,可以实现代码生成、验证等多种高级功能。在未来的学习和实践中,不断探索注解的高级用法,将有助于提升开发效率和代码质量。

    Java基础知识加强PPT

    注解(Annotation)是另一种元数据形式,用于提供有关代码的信息,如元编程、编译时验证和运行时处理。注解可以自定义,也可以使用Java内置的注解,如`@Override`、`@Deprecated`等。 总的来说,这个PPT覆盖了Java...

    非常有用的SSH框架面试题.pdf

    它简化了JDBC访问数据库的代码,并作为主流的持久化框架,利用Java反射机制实现透明性。其工作流程包括: - 读取配置文件和映射信息 - 创建SessionFactory - 打开Session - 创建Transaction - 数据持久化操作 ...

    非常实用的30道java面试题

    8. **集合框架**:Java 集合框架包括 List、Set、Map 等接口和实现类,提供了数据存储和操作的统一接口。ArrayList、LinkedList、HashSet、HashMap 等是常用的集合类。 9. **IO 流**:Java IO 模块提供了读写文件、...

    BeanToJsonSchema:Java bean转换为Json Schema

    1. **反射机制**:首先,通过Java的反射API遍历Java Bean的所有属性,获取其类型、注解等信息。 2. **类型映射**:将Java类型映射到JSON Schema的数据类型,例如,Java的`String`对应JSON Schema的`string`,`...

    2023年ssh框架面试题.doc

    - Hibernate通过配置文件中的`many-to-one`、`one-to-many`、`many-to-many`等注解实现对象间的关联,如一对一、一对多和多对多关系。 4. **Hibernate缓存机制**: - 一级缓存是Hibernate内部的Session级别的缓存...

    java基础案例与开发详解案例源码全

    16.5 利用反射获取注解信息438 16.6 上机练习440 17.1 功能描述442 17.2 总体设计442 17.3 代码实现442 17.4 程序的运行与发布457 17.5 本章练习460 第18章 18.1 JDBC简介462 18.2 JDBC类和接口462 18.2.1 ...

    使用Betwixt将XML转为JAVA Bean(内有JAR包)

    Betwixt基于JavaBeans规范,通过反射和注解来实现XML和Java对象之间的映射。它通过分析Java类的结构来生成XML,或者根据XML的结构来创建Java对象实例。在处理相同节点名的情况下,Betwixt允许我们通过属性名和类型来...

    SSH讲解及应用

    配置文件Struts-config.xml包含了ActionForm、Action和Forward等的配置,通过XML解析并利用反射技术来使用这些配置。 Struts2则引入了FilterDispatcher作为中央控制器的过滤器,Action现在位于Model层,负责调用...

    strutJAVA框架资料

    这款框架在2000年代初期非常流行,帮助开发者组织和管理Java Servlets、JSP(JavaServer Pages)以及JavaBean组件,以实现业务逻辑与表现层的分离,提高开发效率和代码可维护性。 **Struts框架的核心概念:** 1. *...

    框架经典面试题.pdf

    3. **反射机制**:利用Java反射,实现对象和数据库记录之间的透明映射。 4. **性能优化**:Hibernate是轻量级框架,具有良好的性能,支持多种数据库和复杂的对象关系映射。 【Hibernate的延迟加载和关系映射】 - *...

    Hibernate_Validator_reference中文版@www.java1234.com.pdf

    JSR-303规范定义了一套元数据模型和API,允许开发者在JavaBean中声明性地指定验证约束。Hibernate Validator为该规范提供了一个完整的实现,并且提供了额外的约束(例如,NotNull如果null不为空,Size验证大小等)。...

    Hutool 参考文档.pdf

    单例工具(Singleton)和断言(Assert)工具可以方便地实现单例模式和断言验证。二进码十进数(BCD)和控制台打印封装(Console)提供了二进制和十进制相互转换以及格式化控制台输出的功能。 字段验证器(Validator...

    spring定时器需要的jar包.rar

    - `org.springframework.beans-3.1.1.RELEASE.jar`: 提供了对JavaBean属性操作的支持,包括对属性的设置和获取,以及对JavaBean的类型转换和验证等。 - `org.springframework.core-3.1.1.RELEASE.jar`: 包含了...

    apache BeanUtils

    从版本1.8.3开始,BeanUtils引入了对JSR-303/JSR-349 Bean Validation注解的支持,如@NotNull、@Min等,这些注解可以在复制属性时进行验证。 7. 预防性拷贝: BeanUtils还提供了`PropertyUtils.copyProperties()`...

Global site tag (gtag.js) - Google Analytics