Spring + Thymeleaf 自定义验证展示

2024-06-25

我一直在尝试让自定义 javax 验证工作(Spring Boot 和 Thymeleaf),但我不知道如何显示错误消息。问题似乎是,“正常”错误(例如 @Size、@NotNull 等)似乎会向绑定结果添加 FieldError。不过,我的自定义验证器会传递一个 ObjectError 。我不知道如何让 Thymeleaf 显示我的自定义错误(这显然已经通过了,因为th:errors="*{*}"显示它)。

任何帮助是极大的赞赏。

更新: 我现在可以通过显示错误消息

<p th:if="${#fields.hasErrors('${user}')}" th:errors="${user}"></p>

但是,如果我需要多个验证器(例如确认密码和确认电子邮件),则此解决方案将不起作用(或者如果其中一个不合适,则显示两条错误消息。如果您有建议,请不要犹豫。

下面是我为此使用的代码:

模板:

<p th:if="${#fields.hasErrors('username')}"th:errors="*{username}"></p>
<!-- works just fine -->
<p th:if="${#fields.hasErrors('*')}" th:errors="*{*}"></p>
<!-- works and displays all errors (for every field with an error,
 including my custom validator) -->
<p th:if="${#fields.hasErrors('confirmPassword')}" th:errors="*{*}"></p>
<!-- does not work -->
<p th:if="${#fields.hasErrors('*')}" th:errors="*{confirmPassword}"></p>
<!-- does not work -->

验证器实现:

public class PasswordsEqualConstraintValidator implements
        ConstraintValidator<PasswordsEqualConstraint, Object> {

    @Override
    public void initialize(PasswordsEqualConstraint arg0) {
    }

    @Override
    public boolean isValid(Object candidate, ConstraintValidatorContext arg1) {
        User user = (User) candidate;
        return user.getPassword().equals(user.getConfirmPassword());
    }
}

验证器接口:

@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = PasswordsEqualConstraintValidator.class)
public @interface PasswordsEqualConstraint {
    String message();

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

用户.java:

@PasswordsEqualConstraint(message = "passwords are not equal")
public class User implements java.io.Serializable {
...     
@Size(min=2, max=40)
private String username;
...
private String confirmPassword;
...

控制器:

@RequestMapping(value = "/signup", method = RequestMethod.POST)
public String signup(@Valid User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return "signup";
        }
        ... do db stuff .. return "success";
}

这可能是因为您的 @PasswordsEqualConstraint 被分配给整个 bean(类型)而不是字段“confirmPassword”。要将可能的约束违规添加到具体字段,您可以按照下面的示例进行操作。

FieldMatch 比较两个字段,如果它们不相等,则将验证错误分配给第二个字段。

顺便提一句。对于您正在做的事情来说,这是更通用的解决方案。例如,对于密码,您可以使用它,例如

@FieldMatch(first = "password", second = "confirmPassword", message = "Passowords are not equal.")

验证器:

public class FieldMatchValidator implements ConstraintValidator<FieldMatch, Object> {

  private String firstFieldName;
  private String secondFieldName;

  @Override
  public void initialize(final FieldMatch constraintAnnotation) {
    firstFieldName = constraintAnnotation.first();
    secondFieldName = constraintAnnotation.second();
  }

  @Override
  public boolean isValid(final Object value, final ConstraintValidatorContext context) {
    try {
      final Object firstObj = BeanUtils.getProperty(value, firstFieldName);
      final Object secondObj = BeanUtils.getProperty(value, secondFieldName);

      boolean isValid = firstObj == null && secondObj == null || firstObj != null && firstObj.equals(secondObj);

      if (!isValid) {
        context.disableDefaultConstraintViolation();
        context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate()).addNode(secondFieldName).addConstraintViolation();
      }

      return isValid;
    }
    catch (final Exception ignore) {
      // ignore
    }
    return true;
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring + Thymeleaf 自定义验证展示 的相关文章

  • RSA Java 加密和 Node.js 解密不起作用

    我有一个系统 需要在 javascript 中生成 RSA 密钥对 然后将公钥存储在服务器端的数据库中 作为字符串 然后 Java 中的服务器端将使用存储的公钥对字符串进行加密密钥并将其发送到客户端 客户端将使用私钥解密该字符串 我在客户端
  • uniVocity 不会将第一列解析为 beans

    我试图在 uniVocity parsers 的帮助下从 GTFS zip 读取 CSV 文件 但遇到了一个我无法解决的问题 由于某种原因 某些 CSV 文件的第一列似乎无法正确解析 例如 在 stops txt 文件中 如下所示 stop
  • 为什么这个 Java 静态字段为空?

    public class StaticTest private static String a private static String b this is a public static void main String args a
  • HQL - 分页的行标识符

    有谁知道HQL是否有一个关键字来标识行 例如ROWID或ROWNUM 我想使用 HQL 实现分页 但我无法使用 setMaxResult 或 setFirstResult 因为我不直接使用会话对象 因此不使用 Query 对象 而只是将查询
  • 单击按钮时更改照片

    import javax swing Icon import javax swing ImageIcon public class Stage1 extends javax swing JFrame int score 0 int iter
  • Spring Data JPA 规范继承

    我有三个实体 如下所示 Entity Inheritance strategy InheritanceType JOINED DiscriminatorColumn name type public abstract class Emplo
  • 我应该在远程工作站的哪里放置 CSV 配置文件以进行分布式 JMeter 测试?

    我想做JMeter分布式测试 手册上说首先我应该开始jmeter server在远程节点上 然后我应该更新jmeter config并运行jmeter在主节点上 我做了所有这些步骤 我的测试计划包括使用 CSV 配置文件 如果我只从 1 个
  • 获取 Spring Boot 中当前活动数据源的引用

    我想通过实现数据库数据初始化DataSourceInitializer 我将这些方法放在我的 Spring Boot 主方法下面 但似乎它根本没有被执行 我尝试故意删除字符只是为了触发一个错误来确认执行 什么也没有发生 Configurat
  • Log4j 2.x 如何实现惰性参数求值?

    鉴于Java 参数评估机制 http docs oracle com javase specs jls se8 html jls 15 html jls 15 12 4 2 如何Log4j 2 x实施惰性评估 https logging a
  • StringBuilder - 重置或创建新的

    我有一个条件 StringBuilder 不断存储与大型平面文件 数百 MB 中的模式匹配的行 但是 在达到条件后 我将 StringBuilder 变量的内容写入文本文件 现在我想知道是否应该通过重置对象来使用相同的变量 gt strin
  • 菜单项标题未显示

    菜单项的标题未显示在片段内 我在菜单文件中有两个项目 第一个是带有图标和标签的showAsAction always在工具栏中显示图标 第二个只有标题 我不知道这里出了什么问题 菜单项的所有操作均有效 例如下面 菜单 销售 xml menu
  • 如何更新 Websphere 7 以使用 EL2.2?

    这就是我所做的 按照此林肯 巴克斯特的帖子 http ocpsoft com java jsf2 java jsf2 how to add the magic of el el2 to jsf 我下载了 el api 2 2 jar 和 e
  • 如何显示 javadoc 代码块中的泛型?

    我有一个 javadoc 代码块 我想在其中编写一个包含泛型的代码示例 如下所示 public interface SomeInterface
  • 在同步子句中抛出异常的副作用?

    从同步子句中抛出异常是否有任何不清楚的副作用 锁会发生什么情况 private void doSomething throws Exception synchronized lock doSomething 我没有看到任何副作用 The 锁
  • 在java中访问dll方法

    我正在尝试访问java中用c 编写的dll方法 从下面的代码我试图构建已成功生成的 dll using System using Microsoft Win32 namespace CyberoamWinHelper public clas
  • Java中有没有办法随机获取HashMap的值?

    Java中有没有办法随机获取HashMap的值 这有效 Random generator new Random Object values myHashMap values toArray Object randomValue values
  • JPA2+Hibernate 3.6.0 中的 JTA 还是 LOCAL 事务?

    我们正在重新思考我们的技术堆栈 以下是我们的选择 由于应用程序的复杂性等 我们不能没有 Spring 和 Hibernate 我们还从 J2EE 1 4 迁移到 Java EE 5 技术栈 Java EE 5 JPA 2 0 我知道Java
  • DocumentBuilder 解析产生无效字节 2 of 4 字节 UTF-8 序列错误

    我正在尝试解析包含字符串的字节数组Impresi n in XML final DocumentBuilderFactory builderFactory DocumentBuilderFactory newInstance final D
  • Tomcat 中 JNDI 的 Java Mail API 配置文档

    我花了几天时间弄清楚如何通过 JNDI 在 Tomcat 中配置 javax mail Session有认证 现在我明白了 但只是在深入研究代码之后 这次我看到了有史以来最糟糕的代码 javax mail Service connect S
  • 从 google play 中提取统计信息

    我正在建立一些统计数据 并希望获得来自 google play 应用程序商店 的统计数据 最受欢迎 下载量 价格等信息 有谁知道是否有这个 API 或者我必须自己抓取它 有一个名为 android market api 的项目http co

随机推荐

  • 无法在 Safari 中检测到鼠标滚轮事件

    我正在尝试检测鼠标滚轮事件以调整滚动元素的大小 我有 mainDiv与几个 foo里面的桌子 我想改变 foo元素在滚动上的比例 但保留 mainDiv的大小是一样的 这是我的功能 var content document getEleme
  • 从浏览器扩展调用网页 JavaScript 方法

    我正在开发一个firefox扩展使用网络扩展 https developer mozilla org en US docs Mozilla Add ons WebExtensions Getting started这将帮助我简化以下场景的工
  • JSS 中的简单选择器和嵌套选择器

    我目前正在接受 ReactJS 培训 我正在使用material ui 和JSS 对我来说完全是新的 我不明白如何简单地选择我的 H6 元素或我的 H6 子元素 dangerStyle 任何想法 Thanks myJss js const
  • 生成带有文档的 XML 架构

    有没有办法生成带有文档的 XML Schema xsd
  • 使用 jquery 将一个 html 页面加载到另一页面中

    我想在里面加载一个 html 文件 hello world html 另一个 html 页面 index html 这两个文件位于同一位置 这是我写的代码 但它没有加载任何东西 两个警报都有效 我故意发出来检查是否 jquery 是否工作
  • Surefire 未接受 Junit 4 测试

    由于某种原因 我无法让 Maven 2 Surefire 插件执行 JUnit 4 测试类 public class SimpleTest org junit Test public void simple System out print
  • 带有命名参数的 vsprintf 或 sprintf,或者 PHP 中的简单模板解析

    我正在寻找一种使用方法命名参数 for sprintf or printf Example sprintf Last time logged in was hours hours minutes minutes seconds second
  • Spark UDF 错误 - 不支持 Any 类型的架构

    我正在尝试创建一个 udf 它将列中的负值替换为 0 我的数据框名为 df 包含一列名为 avg x 这是我创建 udf 的代码 val noNegative udf avg acc x Double gt if avg acc x lt
  • 阻止直到表单关闭?窗体

    我有一个启动 formB 的表单 我希望将 forma 隐藏起来 直到 form 关闭 formC 和其他人可能打开了一个更改表单 所以我根本无法创建一个新表单 有没有办法启动 formB 隐藏并阻止直到关闭 这应该可以做到 this Vi
  • 如何编写简单的SMPP服务器

    我想编写一个简单的 SMPP 服务器 基本上将流量转发到另一个 SMPP 服务器 C PHP 我需要知道哪些事情 我该如何继续 关于 Goran 的评论 一种可能的解决方案是一个简单的 tcp 代理 例如简单代理 http sourcefo
  • 在 C#/VB.NET 或 C++ Win32 中启用/禁用 Aero

    如何在 C NET 或 C Win32 中禁用航空效果 这是我在 C C 中的测试代码 但仅在我的应用程序运行时才有效 include
  • 函数重载在运行时如何工作,为什么要重载?

    假设我有一个名为 ClothingStore 的类 该类有 3 个成员函数 将访问者引导至商店的正确部门 成员函数为 ChildrenDept MenDept 和 WomenDept 具体取决于访客是儿童 男性还是女性 函数重载可用于创建
  • QlikView 中的 TOTAL 与 Aggr

    我试图理解如何TOTAL and Aggr在 QlikView 中工作 有人可以解释一下下面两个例子之间的区别吗 如果可能的话请用 SQL 查询来说明 示例1 Max
  • 使用 Android 检测用户活动(跑步、骑自行车、驾驶)

    使用我的 Android 设备如何检测用户是否正在步行 骑自行车或开车 我已经检查过谷歌健身应用程序 https play google com store apps details id com google android apps f
  • DotNetOpenId —“此消息已被处理”错误(第 2 部分)

    这已经被问过Here https stackoverflow com questions 727838 dotnetopenid this message has already been processed error 但不是我做的 OP
  • 使用 openCV 检测 ROI

    我正在做一项工作 我必须找到感兴趣的区域 ROI 然后对图像执行阈值 由于我不是计算机领域的 所以我遇到了一些困难 我开始尝试通过以下代码找到投资回报率 code string filename 2011 06 11 09 3A12 3A1
  • 如何在不指定数据集的情况下调整函数

    我有一个函数 基本上可以过滤SPV行 如下所示 请注意 我这样做return coef lt function df1 idd dmda CategoryChosse 然而 我不希望df1作为函数的参数 而是函数的属性df1数据集 在本例中
  • C++循环引用问题

    我有两节课 DataObject and DataElement DataObject保存指向 仅 的指针DataElements 和一个DataElement包含指向多种类型的指针 其中一个DataObject 这曾经没有问题 因为我只使
  • Twig 渲染与包含 - 何时何地使用其中之一?

    我读了Twig 渲染与包含 https stackoverflow com questions 9077097 twig render vs include但这不是我要找的 我不确定应该在何时何地使用 render 以及何时应该使用 inc
  • Spring + Thymeleaf 自定义验证展示

    我一直在尝试让自定义 javax 验证工作 Spring Boot 和 Thymeleaf 但我不知道如何显示错误消息 问题似乎是 正常 错误 例如 Size NotNull 等 似乎会向绑定结果添加 FieldError 不过 我的自定义