springmvc项目使用@Valid+BindingResult遇到的问题

针对“springmvc项目使用@Valid+BindingResult遇到的问题”,我提供以下完整攻略:

1. 理解问题

经过实践和研究,我们发现当使用@ValidBindingResult配合进行表单数据校验时,有时会遇到一些问题。

问题的根本原因在于BindingResult的处理方式与我们期望的不太一样,它不会使@Valid注解的校验失败,而是将校验结果存储在自己的对象中,因此我们需要强制判断BindingResult对象中是否存在校验错误。

在这个问题的基础上,我将为您提供两个示例以更全面地理解问题和解决方案。

2. 示例一

User类为例:

public class User {
    @NotNull(message="用户名不能为空")
    private String username;
    @NotNull(message="密码不能为空")
    private String password;
}

我们期望对该类进行表单数据校验。

Controller中,我们使用@Valid注解进行校验:

@RequestMapping("/login")
public String login(@Valid User user, BindingResult result) {
    if (result.hasErrors()) {
        return "error";
    }
    //根据用户输入执行登录代码
    return "success";
}

但是在表单提交时,即使输入为空,也不会返回"error",而是直接进入success页面。

出现这种情况的原因是,BindingResult对象不会使@Valid注解的校验失败,而只是将User对象中的值进行校验,并将结果保存在BindingResult对象中。因此,我们需要修改Controller中的代码,将if语句中的条件改为:

if (result.hasErrors()&&(user!=null)) {
    return "error";
}

即判断result.hasErrors()是否为true,并且user对象是否不为空。这里需要注意的细节是,必须先判断result.hasErrors()是否为true,否则当user对象为null时,result.hasErrors()也会返回true,从而导致代码逻辑错误。

3. 示例二

Address类为例:

public class Address {
    @NotNull(message="城市不能为空")
    private String city;
    @NotNull(message="街道不能为空")
    private String street;
}

我们期望对该类进行表单数据校验,但实际上会遇到NullpointerException错误:

@RequestMapping("/address")
public String address(@Valid Address address, BindingResult result) {
    if (result.hasErrors()) {
        return "error";
    }
    //根据用户输入执行查询地址代码
    return "success";
}

在该代码中,如果用户提交的表单数据中,citystreet其中一项为空,将会执行result.hasErrors(),从而返回"error"。但是,如果用户提交的表单数据中,address为空,将会出现NullpointerException错误。

这是因为BindingResult在未能把校验结果存储到Address对象中时,把Address对象设置为了null,导致在if (result.hasErrors())中抛出NullpointerException异常。因此,我们需要修改address方法中的代码,将if语句中的条件改为:

if ((address==null)||result.hasErrors()) {
    return "error";
}

在这里,我们先判断address对象是否为空,如果为空,直接返回"error";否则再判断result.hasErrors()是否为true,从而返回正确的校验结果。

4. 总结

针对“springmvc项目使用@Valid+BindingResult遇到的问题”,我们提供了以下攻略:

  • 理解BindingResult处理方式的不同,正确判断校验结果;
  • 通过以上两个示例,全面了解问题的详细情况和解决方案。

希望这些内容能够对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springmvc项目使用@Valid+BindingResult遇到的问题 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 如何使用安全管理器?

    如何使用安全管理器 安全管理器是用于管理应用程序的安全性的工具。它可以控制应用程序的访问权限,确保只有经过授权的用户可以访问应用程序的敏感信息。下面介绍如何使用安全管理器。 步骤1:创建安全策略文件 要使用安全管理器,首先需要创建安全策略文件。安全策略文件中定义了应用程序的安全规则和策略。在安全策略文件中,我们可以定义如下规则: 允许/拒绝特定用户或用户组访…

    Java 2023年5月11日
    00
  • Java使用IO模拟注册登录

    下面是Java使用IO模拟注册登录的完整攻略: 1. 需求分析 我们需要设计一套用户注册登录系统,需满足以下几个功能: 用户注册:通过键盘输入用户名和密码,将其写入到本地文件中保存。 用户登录:通过键盘输入用户名和密码,在本地文件中验证用户的正确性。 2. 设计思路 我们需要设计两个类:一个用于用户注册,一个用于用户登录。其中,用户注册需要将用户输入的用户名…

    Java 2023年6月15日
    00
  • Spring中BeanFactory和ApplicationContext的作用和区别(推荐)

    BeanFactory和ApplicationContext的区别 BeanFactory是Spring Framework中最基础的IOC容器,用于创建和管理应用中的Bean对象,提供对依赖注入(DI)和面向切面编程(AOP)的基本支持。 ApplicationContext是一个高级的IOC容器,它扩展了BeanFactory,并提供了更多的企业级功能,…

    Java 2023年5月19日
    00
  • Java中枚举的实现原理介绍

    Java中枚举的实现原理介绍 什么是枚举 枚举(enum)是Java中的一种数据类型,它允许将一组相关的常量组织在一起,并且可以用枚举类型的名称来引用这些常量,以提高代码的可读性和稳定性。 在使用枚举类型时,我们可以通过枚举类型的名称来访问某个枚举常量,也可以通过枚举常量的名称来获得该常量的值,枚举类型可以与switch语句一起使用,提高代码的可读性。 Ja…

    Java 2023年5月26日
    00
  • SpringBoot整合Thymeleaf小项目及详细流程

    Spring Boot整合Thymeleaf小项目及详细流程 本文将介绍如何使用Spring Boot整合Thymeleaf模板引擎,以及详细的流程和示例。 什么是Thymeleaf Thymeleaf是一种现代化的服务器端Java模板引擎,它可以处理HTML、XML、JavaScript、CSS甚至纯文本。它的主要目标是为Web和独立环境创建优雅的自然模板…

    Java 2023年5月15日
    00
  • Android 兼容性问题:java.lang.UnsupportedOperationException解决办法

    Android 兼容性问题:java.lang.UnsupportedOperationException解决办法 在Android开发中,经常会遇到兼容性问题。其中一个常见的问题就是java.lang.UnsupportedOperationException异常。本文将会详细讲解这个异常的产生原因和解决办法。 异常产生原因 java.lang.Unsup…

    Java 2023年5月27日
    00
  • Mybatis 动态SQL的几种实现方法

    Mybatis 是一款开源的持久层框架,它支持动态 SQL(Dynamic SQL)语句的构建,使 SQL 语句变得更加灵活,并且可以减少代码的冗余度。下面将详细介绍几种 Mybatis 动态SQL的实现方法。 实现方式一:使用 if 标签 if 标签是 Mybatis 中常用的一个动态 SQL 标签,它可以根据条件判断来决定是否生成 SQL 语句片段,代码…

    Java 2023年5月20日
    00
  • Java统计代码的执行时间的N种方法

    Java 统计代码执行时间的方法有很多,不同情况下适用不同的方法。下面是几种常见的方法: 1. System.currentTimeMillis() 使用 System.currentTimeMillis() 可以获取从1970年1月1日 00:00:00 GMT 开始,到当前时间经过的毫秒数。我们可以分别在代码执行前和执行后获取时间戳,然后计算差值,即可得…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部