校验

本贴最后更新于 2601 天前,其中的信息可能已经时移世异

开发 web 的过程中校验并返回错误信息,的简单操作一直是我们一直以来追求的。如何用最方便最实用的方法来校验,这里 spring 给我们提供了极为方便的操作。

返回提示信息

校验完第一个操作应该返回错误或提示信息,所以这里先说如何简单而又方便的返回错误信息。

  • spring 提供了异常统一处理的操作。@ControllerAdvice

  • 从这里可以看到 _@ControllerAdvice_也注释了 @Component,只要扫描它,它也会被 spring 自动注入。
    image.png

  • @ControllerAdvice 中其他注解暂时不论,主要说明一下 @ExceptionHandler 这个注释在方法上的注解,下面是这个注解的一个例子

  • image.png

  • @ExceptionHandler 注解在方法上,提供一个默认异常来智能拦截。比如声明一个 TipException 异常类(继承 RuntimeException);如果在运行时抛出 TipException 异常,会被该方法拦截到,并进行下一步的处理(返回提示信息,或错误页面)

image.png

校验问题

既然有了 @ControllerAdvice,那我们可以随时随地的抛出错误信息。接下来就是校验问题:直接在业务逻辑中写校验代码,会增加代码的难读性和逻辑的复杂性,简单的方法就是在外部写出校验,需要就调用就好。spring 自带有拦截器,可是一个个方法的拦截器都需要配置;aop 却是"大题小用";而且,如果需要校验的请求过多,确实有点不简明。借鉴 jfinal,启发了我们是不是能在拦截器上花点功夫?

  • 预想是这样,我们只需要在所要校验的方法上,加个注释(比如叫做:@Before),给它加不同的校验类,来实现不同的校验效果。
  • 首先写一个声明,@Before,并声明它是在方法上用。

image.png

  • 里面 value 值是一个校验类数组。
  • 接下来,声明一个接口 BeforeInterceptor,该接口中只有一个方法,以进行校验操作。所有的校验类,必须继承该接口。
 void doOperator(HttpServletRequest request, HttpServletResponse response);
  • 紧接着,创建一个普通的 spring 内部拦截器,拦截所有请求。
    在 preHandle 方法中,进行校验。
@Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        HandlerMethod handlerMethod = (HandlerMethod) o;
        Method method = handlerMethod.getMethod();
        Before before = method.getAnnotation(Before.class);
        if(before != null){
            Class<? extends BeforeInterceptor>[] beforeList = before.value();
            for(Class<? extends BeforeInterceptor> oneClazz : beforeList){
                BeforeInterceptor oneEntity= applicationContext.getBean(oneClazz);
                oneEntity.doOperator(httpServletRequest,httpServletResponse); //调用方法
            }
        }
        return true;
    }
  • 而校验类只需要进行应有的操作,必要时抛出错误信息即可。

image.png

  • 所请求的方法,只需要加 @Before 声明,并根据需求添加校验类。

image.png

  • PS:根据需求可以扩展在类上加 Before 注解,校验其下所有请求。

~转自:http://www.jianshu.com/p/762019e23a57

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8208 回帖
  • 校验
    3 引用 • 11 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    942 引用 • 1458 回帖 • 109 关注

相关帖子

5 回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 我可以说我昨晚把一个 js 拆为了 10 个。

  • 其他回帖
  • zk123
    作者

    感觉比较有规范吧。都是一个接口下的子类,维护也好维护;而且这个请求有什么校验,能一眼看出来,写在方法里不容易查找。

  • feix

    但是这样校验的结果不就是每个不同的方法,你就要单独再出去写一个校验类么?跟直接写方法里有什么区别么?

    2 回复
  • feix

    😆 我竟觉得很有道理啊~

    1 回复
  • 查看全部回帖
zk123
原来生活仅仅是一场骗局 郑州

推荐标签 标签

  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4599 回帖 • 701 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 60 回帖 • 464 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 640 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 5 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖
  • sts
    2 引用 • 2 回帖 • 167 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    5 引用 • 13 回帖
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 395 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    175 引用 • 994 回帖 • 1 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 52 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    85 引用 • 122 回帖 • 619 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 28 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    389 引用 • 1246 回帖 • 593 关注
  • 分享

    有什么新发现就分享给大家吧!

    245 引用 • 1776 回帖 • 3 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    41 引用 • 40 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    333 引用 • 619 回帖
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 566 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    4 引用 • 91 回帖
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 20 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    86 引用 • 897 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 2 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 81 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    20195 引用 • 77996 回帖 • 2 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 615 关注