如何自定义 Hibernate @Size 错误消息以指示输入字段的长度

2023-11-24

我想自定义文本字段的错误消息以包含输入的实际字符数。我已经能够做到这一点,但对我的解决方案不满意,所以我想知道其他人做了什么来实现这一目标。

  • 春季4.1.2
  • 休眠4.3.10
  • 休眠验证器 5.1.3

字段注释(出于测试目的,仅限 10 个 - 实际大小为 150)

@Column(name = "NAME", nullable = false)
@Size(max=10)
private String name;

消息属性

Size.person.name=Maximum is {1} characters

JSP code

    <spring:bind path="person.name">
        <c:set var="nameError">${status.errorMessage}</c:set>
        <c:set var="nameDisplayValue">${status.displayValue}</c:set>
        <c:set var="nameCode">${status.errorCode}</c:set>
    </spring:bind>
    <c:if test="${fn:contains(nameCode,'Size')}">
        <c:set var="nameLen">${fn:length(nameDisplayValue)}</c:set>
        <c:if test="${nameLen gt 0}">
            <c:set var="nameError">${nameError += " (you entered " += nameLen += ")"}</c:set>  
        </c:if>
    </c:if>

    <div class="form-group col-sm-9 <c:if test="${not empty nameError}">has-error</c:if>">
        <label class="control-label" id="nameLabel" for="inputName">Name:<c:if test="${not empty nameError}">&nbsp;&nbsp;${nameError}</c:if></label>
        <form:input type="text" size="10" class="form-control" id="inputName" placeholder="Name" path="name" autocomplete="off"/>                                                           
    </div>

Output

enter image description here

这对于一个字段来说没问题,但我正在处理的表单有超过 10 个具有大小验证的字段。此外,form:input 的 size="10" 设置似乎没有实际执行任何操作,即您仍然可以输入超过 10 个字符。

我知道一种选择是编写一个自定义验证器,但这对于我想做的事情来说似乎有点矫枉过正。另一种方法是在发布表单之前捕获错误,但我试图将所有验证保留在服务器端。任何建议将不胜感激。


Hibernate 文档中有一个关于插入验证消息的很好的文档:第 4 章 内插约束错误消息.

如果您创建一个文件ValidationMessages.properties在类路径的根目录中,然后您可以更改其中的所有验证消息:

javax.validation.constraints.Size.message=Please enter at least {min} and at most {max} characters.

中的参数{...}只是注释的属性名称。这几乎适用于所有限制。如果你想引用经过验证的值,你可以使用{validatedValue}。你也可以使用Formatter格式化值:

... ${formatter.format('...', validatedValue)} ...

不幸的是没有格式字符串length.

所以如果你真的想向所有人传达这样的信息@Size,那么你将不得不实现你自己的javax.validation.MessageInterpolator (see 自定义消息插值在上面的链接中)。

补充说明:更改默认验证消息会产生副作用:@Size也可用于收藏。在这种情况下,至少我的信息是不合适的。我通常为此创建第二条验证消息:

javax.validation.constraints.Size.Collection.message=Please select at least {min} and at most {max} elements.

并在约束中使用该值:

public final class ValidationMessages {
  public static final String COLLECTION_SIZE = 
      "javax.validation.constraints.Size.Collection.message";
}

public class MyClass {
    @Size(min = 1, max = 10, message = ValidationMessages.COLLECTION_SIZE)
    private Collection<String> elements;
}

通过代码样式工具中的匹配规则,我确保不会忘记定义消息@Size集合上的注释。

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

如何自定义 Hibernate @Size 错误消息以指示输入字段的长度 的相关文章

随机推荐

  • 在 jQuery 中创建 div 元素 [重复]

    这个问题在这里已经有答案了 我如何创建一个div元素在jQuery 从 jQuery 1 4 开始 您可以将属性传递给自封闭元素 如下所示 jQuery div id some id class some class some other
  • socket.error: [Errno 32] 管道损坏

    我编写了一个客户端 服务器 python 程序 其中客户端将列表发送到服务器 服务器接收数组 删除列表的前两个元素并将其发送回客户端 服务器接收列表没有问题 但是当服务器想要发回编辑后的列表时 它显示错误 socket error Errn
  • 如何在 Visual Studio 中静态链接 VCPKG 生成的 .lib 文件

    我使用 VCPKG 构建第三方库 例如 libcurl 我有动态和静态构建 显然 导入 lib和对象 lib文件分别包含在两个不同的文件夹中 x64 windows和x64 windows static 我想将对象 libcurl lib
  • 在 D3.js 中重新排序 SVG ( z-index ) 元素

    我意识到这个问题以前已经被问过 但我无法深入了解 这是我的图表 http www gogeye com financialnews piechart index3 html 我想做的就是将硬币渲染在图表后面 我知道 D3 渲染是按照附加顺序
  • 如何查询pandas中的MultiIndex索引列值

    代码示例 In 171 A np array 1 1 1 1 3 3 3 3 5 5 6 6 In 172 B np array 111 222 222 333 333 777 In 173 C randint 10 99 6 In 174
  • 将图像转换为 Base64,反之亦然

    我想将图像转换为 Base64 然后再次转换回图像 这是我到目前为止尝试过的代码以及错误 请问有什么建议吗 public void Base64ToImage string coded System Drawing Image finalI
  • 在 Java 中构建 SQL 字符串的最简洁方法

    我想构建一个 SQL 字符串来执行数据库操作 更新 删除 插入 选择之类的事情 而不是使用数百万个 和引号的糟糕的字符串连接方法 这充其量是不可读的 有一定是更好的方法 我确实考虑过使用 MessageFormat 但它应该用于用户消息 尽
  • PHP:MySQL 服务器消失了

    我知道这个问题已经被问过很多次了 但我已经尝试了一切 我有一个 PHP 脚本 它会迭代数千个图像 根据需要执行调整大小 然后插入数据库 我收到此错误消息 警告 mysql query function mysql query MySQL 服
  • 后置和前置增量运算符

    当我运行以下示例时 我得到输出 0 2 1 class ZiggyTest2 static int f1 int i System out print i return 0 public static void main String ar
  • Android 中的 TTS 暂停

    我正在开发一个应用程序 它可以读出文档中的文本 我想添加暂停和恢复功能 但我在 TTS 中找不到任何暂停 方法 有什么办法可以让我暂停吗 有一个方法可以暂停 只需致电TextToSpeech playSilence 请参阅下面的代码here
  • 跨源请求被阻止 Spring REST 服务 + AJAX

    无法调用spring REST服务 我的春季服务 RequestMapping value MAS authenticate method RequestMethod POST public ResponseEntity
  • 将掩码应用于字符串

    我正在从表中读取字符串 ID 值 当用户输入 ID 时 是使用用户定义的输入掩码完成的 因此掩码可能类似于000 00 0000 AA 9999999等 掩码会因用户而异 因此必须在运行时进行评估 鉴于表中仅存储字母数字文本 那么应用该掩码
  • 如何删除 Logstash 过滤器中所有具有 NULL 值的字段

    我正在使用 Logstash 读取 csv 格式的检查点日志文件 并且某些字段具有空值 我想删除所有具有空值的字段 我无法准确预见哪些字段 键 将具有空值 因为我的 csv 文件中有 150 列 并且我不想检查其中的每一列 是否可以在log
  • 如何按特定字段对 Spark DataFrame 中的结构类型数组进行排序?

    给出以下代码 import java sql Date import org apache spark sql SparkSession import org apache spark sql functions object SortQu
  • 在 LLDB 调试器中显示变量属性的值?

    我正在使用 Log Message 操作的断点 并且我想打印 NSIndexPath 的行 所以我尝试 cell row indexPath row 但什么也没有打印出来 我还尝试使用调试器命令 expr void NSLog indexP
  • psql:无法将主机名“somePostgres”转换为地址:名称或服务未知

    我正在 docker 中构建 java spring mvc 应用程序 并且 dokefile 构建涉及与 postgres 容器交互 每当我跑步时docker compose updockerfile 中与 postrges 交互的步骤有
  • 使用 lift-json 将 Json 值提取为 Map

    lift json 的文档表明我应该能够调用 values 来获取当前的 JObject 结构作为普通的 Scala Map 这种方法对我来说不起作用 因为 值 的返回类型是 json Values 而不是示例所示的 Map 我究竟做错了什
  • 运算符“>=”不能应用于“string”和“string”类型的操作数

    我在 C 中使用实体框架 我的代码是 var result ef services Where entry gt entry tarikhservice gt textBoxX1 Text entry tarikhservice lt te
  • AWS Athena (Presto) OFFSET 支持

    我想知道 AWS Athena 是否支持 OFFSET 对于 mysql 以下查询正在运行 但在 athena 中它给了我错误 任何例子都会有帮助 从员工中选择 其中 empSal gt 3000 LIMIT 300 OFFSET 20 A
  • 如何自定义 Hibernate @Size 错误消息以指示输入字段的长度

    我想自定义文本字段的错误消息以包含输入的实际字符数 我已经能够做到这一点 但对我的解决方案不满意 所以我想知道其他人做了什么来实现这一目标 春季4 1 2 休眠4 3 10 休眠验证器 5 1 3 字段注释 出于测试目的 仅限 10 个 实