[SpringMVC] Web层注解式参数校验

简介: Controller层方法经常会接收前端返回的数据,并进行参数校验。可以采取注解式的参数校验方法,这样就不需要在每个controller方法里都手写参数校验代码。

Controller层方法经常会接收前端返回的数据,并进行参数校验。
可以采取注解式的参数校验方法,这样就不需要在每个controller方法里都手写参数校验代码。

思路

  • 使用 Hibernate validator 参数校验
  • 对实体类进行注解,将校验代码配置成注解
  • 不同的Controller方法可能有不同的校验需求,可采用分组校验的方法解决
  • 特殊的校验需求,可以使用自定义校验注解的方式处理

实现

  • 建立校验分组

    校验分组可实现对不同校验需求进行不同适配。只需要建立接口即可。

package com.zp.haveplace.validator.group.admin;

/**
 * 校验分组
 * 管理员登录时的Controller校验
 * @author zp
 * @date 2018/4/20
 */
public interface LoginValidatorGroup {
}

package com.zp.haveplace.validator.group.admin;

/**
 * 校验分组
 * 修改管理员信息时的Controller校验
 * @author zp
 * @date 2018/4/20
 */
public interface UpdateAdminValidatorGroup {
}

  • 实体类中对需要校验的字段进行注解
package com.zp.haveplace.entity;

import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.FieldFill;
import com.baomidou.mybatisplus.enums.FieldStrategy;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.zp.haveplace.util.TimeUtils;
import com.zp.haveplace.validator.group.admin.AddAdminValidatorGroup;
import com.zp.haveplace.validator.group.admin.LoginValidatorGroup;
import com.zp.haveplace.validator.group.admin.UpdateAdminValidatorGroup;
import org.hibernate.validator.constraints.NotEmpty;

import javax.validation.constraints.Min;
import java.util.Date;

/**
 * 后台管理员信息
 * "password",isDeleted","gmtCreate","gmtModified"字段不输出
 */
@JsonIgnoreProperties({"password","isDeleted","gmtCreate","gmtModified"})
@TableName("_admin")
public class Admin {

    @NotEmpty(message = "被修改管理员id不能为空",groups = {UpdateAdminValidatorGroup.class})
    @Min(value = 1,message = "id必须大于0",groups = {UpdateAdminValidatorGroup.class})
    private Integer adminId;

    // 登录校验,添加校验
    @NotEmpty(message = "账号不能为空",groups = {LoginValidatorGroup.class,AddAdminValidatorGroup.class})
    private String account;

    // 登录校验,添加校验
    @NotEmpty(message = "密码不能为空",groups = {LoginValidatorGroup.class,AddAdminValidatorGroup.class})
    private String password;

    private Integer role;
    private String phone;
    private String comment;
    private Integer isDeleted;
    private Date gmtCreate;
    private Date gmtModified;

    //......get/set方法
}

其中,@JsonIgnoreProperties注解是用于实体类包装返回为JSON时需要忽略的字段;message意思是校验不通过时返回的信息,信息除了硬编码以外,还可以通过配置文件获取,我采取了硬编码;groups是校验分组。

  • Controller使用校验
package com.zp.haveplace.web;

import com.zp.haveplace.annotation.LoginRequired;
import com.zp.haveplace.annotation.RoleRequired;
import com.zp.haveplace.bean.PageBean;
import com.zp.haveplace.bean.ResponseBean;
import com.zp.haveplace.common.RoleConst;
import com.zp.haveplace.common.SessionConstant;
import com.zp.haveplace.entity.Admin;
import com.zp.haveplace.service.AdminService;
import com.zp.haveplace.bean.LoggerBean;
import com.zp.haveplace.util.TimeUtils;
import com.zp.haveplace.validator.group.admin.LoginValidatorGroup;
import com.zp.haveplace.validator.group.admin.UpdateAdminValidatorGroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.security.acl.Group;
import java.util.EnumSet;
import java.util.List;
import org.springframework.validation.BindingResult;

/**
 * 管理员控制器
 *
 * @author zp
 * @date 2018/4/21
 */
@Controller
@RequestMapping("/admin")
public class AdminController{

    // 用户登录方法
    @RequestMapping(value = "/login",method = RequestMethod.POST)
    @ResponseBody
    public ResponseBean login(@Validated(value = {LoginValidatorGroup.class}) Admin loginAdmin,
                              BindingResult bindingResult,
                              HttpServletRequest request)throws Exception{
        //需要校验的参数必须使用@Validated注解,并在此注解后增加BindingResult参数
        //@Validated需配置校验分组
        //BindingResult类用于存储校验结果
        //检查校验结果
        if(bindingResult.hasErrors()){
            String errorInfo = "";
            List<FieldError> errors = bindingResult.getFieldErrors();//获取字段参数不合法的错误集合
            for(FieldError error : errors){
                errorInfo = errorInfo + "[" + error.getField() + " " + error.getDefaultMessage() + "]";
            }
            return new ResponseBean().setExceptionResponse(errorInfo);//返回校验错误
        }

        //.....业务逻辑代码

        return new ResponseBean().setSuccessMessage("登录成功");
    }

}

对校验结果的检查,可以采用AOP方式实现,彻底抛弃controller硬编码。具体实现请参考:
[Spring] Web层使用AOP方式进行参数校验

  • 自定义校验

    百度有很多

参考

部分源码及思路来自:
优雅的SSM(Spring+SpringMVC+Mybatis)框架
Hibernate Validator注解大全
[SpringMVC] Web层返回值包装JSON

相关文章
|
4月前
ssm使用全注解实现增删改查案例——web.xml
ssm使用全注解实现增删改查案例——web.xml
|
9月前
|
存储 前端开发 Java
SpringMVC中重定向请求时传输参数原理分析与实践
SpringMVC中重定向请求时传输参数原理分析与实践
169 2
SpringMVC中重定向请求时传输参数原理分析与实践
|
4月前
|
前端开发 Java 开发者
Spring MVC:构建高效、可维护、可扩展的Web应用程序
Spring MVC:构建高效、可维护、可扩展的Web应用程序
42 0
|
4月前
|
前端开发 Java 测试技术
Java一分钟之Spring MVC:构建Web应用
【5月更文挑战第15天】Spring MVC是Spring框架的Web应用模块,基于MVC模式实现业务、数据和UI解耦。常见问题包括:配置DispatcherServlet、Controller映射错误、视图解析未设置、Model数据传递遗漏、异常处理未配置、依赖注入缺失和忽视单元测试。解决这些问题可提升代码质量和应用性能。注意配置`web.xml`、`@RequestMapping`、`ViewResolver`、`Model`、`@ExceptionHandler`、`@Autowired`,并编写测试用例。
326 3
|
4月前
|
XML 存储 Java
11:Servlet中初始化参数的获取与应用-Java Web
11:Servlet中初始化参数的获取与应用-Java Web
82 3
|
19天前
|
前端开发 安全 Java
技术进阶:使用Spring MVC构建适应未来的响应式Web应用
【9月更文挑战第2天】随着移动设备的普及,响应式设计至关重要。Spring MVC作为强大的Java Web框架,助力开发者创建适应多屏的应用。本文推荐使用Thymeleaf整合视图,通过简洁的HTML代码提高前端灵活性;采用`@ResponseBody`与`Callable`实现异步处理,优化应用响应速度;运用`@ControllerAdvice`统一异常管理,保持代码整洁;借助Jackson简化JSON处理;利用Spring Security增强安全性;并强调测试的重要性。遵循这些实践,将大幅提升开发效率和应用质量。
45 7
|
20天前
|
Java 开发者 前端开发
Struts 2、Spring MVC、Play Framework 上演巅峰之战,Web 开发的未来何去何从?
【8月更文挑战第31天】在Web应用开发中,Struts 2框架因强大功能和灵活配置备受青睐,但开发者常遇配置错误、类型转换失败、标签属性设置不当及异常处理等问题。本文通过实例解析常见难题与解决方案,如配置文件中遗漏`result`元素致页面跳转失败、日期格式不匹配需自定义转换器、`&lt;s:checkbox&gt;`标签缺少`label`属性致显示不全及Action中未捕获异常影响用户体验等,助您有效应对挑战。
44 0
|
20天前
|
Java 前端开发 Apache
Apache Wicket与Spring MVC等Java Web框架大PK,究竟谁才是你的最佳拍档?点击揭秘!
【8月更文挑战第31天】在Java Web开发领域,众多框架各具特色。Apache Wicket以组件化开发和易用性脱颖而出,提高了代码的可维护性和可读性。相比之下,Spring MVC拥有强大的生态系统,但学习曲线较陡;JSF与Java EE紧密集成,但在性能和灵活性上略逊一筹;Struts2虽成熟,但在RESTful API支持上不足。选择框架时还需考虑社区支持和文档完善程度。希望本文能帮助开发者找到最适合自己的框架。
27 0
|
3月前
|
安全 前端开发 Java
挑战5分钟内基于Springboot+SpringMVC+Mybatis-plus快速构建web后端三层架构
挑战5分钟内基于Springboot+SpringMVC+Mybatis-plus快速构建web后端三层架构
43 1
|
4月前
ssm(Spring+Spring mvc+mybatis)——web.xml
ssm(Spring+Spring mvc+mybatis)——web.xml