jsr303 自定义消息_JSR 303从I18N属性文件加载消息

jsr303 自定义消息

总览

本文将说明如何适应JSR 303验证API来从I18n属性文件加载消息,并通过保留国际化的所有好处和对多种语言的支持来实现这一点。

为此,我们将实现一个基于Spring API的自定义MessageInterpolator,用于管理I18N消息。

依存关系

在进行这项工作所需的maven依赖项下方,此处未列出Javax验证和Hibernate验证:

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework.webflow</groupId><artifactId>spring-binding</artifactId><version>2.3.2.RELEASE</version></dependency>
</dependencies>

MessageSource的配置

第一步是MessageSource bean的配置,它负责扫描和索引属性文件的内容。

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"><property name="defaultEncoding" value="UTF-8"/><property name="basenames"><list><value>com.myproject.i18n.MyMessages</value><value>com.myproject.i18n.ErrorMessages</value></list></property></bean>

MyMessages和ErrorMessages是我们要扫描的属性文件,文件名支持多种语言的约定。

例如,如果我们的应用程序必须支持英语和法语,那么我们应该具有:MyMessages_en.properties和MyMessages_fr.properties。

自定义MessageInterpolator

在此自定义MessageInterpolator中,我们重新定义了JSR 303解析要显示的消息的方式,我们提供了一个自定义实现,该实现使用Spring MessagesSource和MessageBuild来搜索并准备要显示的消息。

import java.util.Locale;import javax.validation.MessageInterpolator;import org.springframework.binding.message.MessageBuilder;
import org.springframework.context.MessageSource;public class SpringMessageInterpolator implements MessageInterpolator {@Autowiredprivate MessageSource messageSource, @Overridepublic String interpolate(String messageTemplate, Context context) {String[] params = (String[]) context.getConstraintDescriptor().getAttributes().get("params");MessageBuilder builder = new MessageBuilder().code(messageTemplate);if (params != null) {for (String param : params) {builder = builder.arg(param);}}return builder.build().resolveMessage(messageSource, Locale.FRANCE).getText();}@Overridepublic String interpolate(String messageTemplate, Context context, Locale locale) {String[] params = (String[]) context.getConstraintDescriptor().getAttributes().get("params");MessageBuilder builder = new MessageBuilder().code(messageTemplate);if (params != null) {builder = builder.args(params);}return builder.build().resolveMessage(messageSource, local).getText();}
}

在自定义JSR 303上的用法

假设我们创建了一个新的JSR 303验证批注,validate将检查字段是否为空。 要使用定制的Spring消息插值器,我们需要在Spring Message源加载的属性文件之一上声明一条消息,让我们在ErrorMessages.properties上声明:

{com.myproject.validation.NotBlank}    Mandatory field

最佳做法是将消息的键命名为我们的验证批注的完整类名,您可以随意选择任何键名,但必须在方括号{}之间才能使用。

我们的自定义注释将如下所示:

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = NotBlankValidator.class)
public @interface NotBlank {String message() default "{com.myproject.validation.NotBlank";Class<?>[] groups() default {};String[] params() default {};Class<? extends Payload>[] payload() default {};
}

请确认message属性的默认值与您放入属性文件的默认值相同。

就是这样,现在您可以像平常一样使用批注,并且,如果不提供硬编码消息,则在属性文件中声明该消息后,它将从属性文件中加载。

翻译自: https://www.javacodegeeks.com/2014/07/jsr-303-loading-messages-from-an-i18n-property-file.html

jsr303 自定义消息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最优隐神经元数目 算法 matlab,BP算法的改进在Matlab的实现研究

BP 算法的改进在M a tlab 的实现研究姚文俊(中南民族大学电子信息工程学院 湖北武汉 430074)摘 要:利用M atlab 中的神经网络工具箱提供的丰富网络学习和训练函数,对BP 网络和BP 算法的优化方案进行仿真,得到较优的BP 算法。关键词:人工神经网络;BP 网络;M atlab ;N eu ral …

php 导出excel分段导出_PHP 导出excel 数据量大时

public functionceshiexcel1(){set_time_limit(0);$filename 病毒日志;header(Content-Type: application/vnd.ms-excel);header(Content-Disposition: attachment;filename".$filename..csv");header(Cache-Control: max-age0);//原生链接mysql//数据库配置$mysql_…

通过Apache Kafka集成流式传输大数据

从实时实时过滤和处理大量数据&#xff0c;到将日志数据和度量数据记录到不同来源的集中处理程序中&#xff0c;Apache Kafka日益集成到各种系统和解决方案中。 使用CData Sync &#xff0c;可以轻松地将此类解决方案应用于任何CRM&#xff0c;ERP或Analytics软件。 配置Apach…

php7 获取数据流,stream_socket_accept()

stream_socket_accept()(PHP 5, PHP 7)接受由stream_socket_server()创建的套接字连接说明stream_socket_accept(resource$server_socket[,float$timeout ini_get("default_socket_timeout")[,string&$peername]]):resource接受由stream_socket_server()创建的套…

浪潮as5300技术方案_浪潮智能存储AS5300G2双活解决方案

智慧医疗已成为提高就医效率、减少医疗差错的有效科技手段。江西省泰和中医院通过采用浪潮智能存储AS5300G2双活解决方案&#xff0c;构筑了一个满足医院数字化、信息化、智能化、可持续发展的信息支撑系统平台&#xff0c;使业务数据有保障、资源调配共享更高效、运维管理更方…

安卓php推送消息机制,深入剖析Android消息机制原理

在Android中&#xff0c;线程内部或者线程之间进行信息交互时经常会使用消息&#xff0c;这些基础的东西如果我们熟悉其内部的原理&#xff0c;将会使我们容易、更好地架构系统&#xff0c;避免一些低级的错误。在学习Android中消息机制之前&#xff0c;我们先了解与消息有关的…

python单元测试mock_Mock 在 Python 单元测试中的使用

本文讲述的是 Python 中 Mock 的使用。如何执行单元测试而不用考验你的耐心很多时候&#xff0c;我们编写的软件会直接与那些被标记为“垃圾”的服务交互。用外行人的话说&#xff1a;服务对我们的应用程序很重要&#xff0c;但是我们想要的是交互&#xff0c;而不是那些不想要…

php bin2hex(),PHP bin2hex() 函数 pack() 函数

bin2hex() 函数bin2hex() 函数把 ASCII 字符的字符串转换为十六进制值。字符串可通过使用 pack() 函数再转换回去。语法bin2hex(string)string必需。要转换的字符串。示例一把 "Shanghai" 转换为十六进制值$str bin2hex("Shanghai");echo($str); // 53686…

java 泛型示例_使用Java泛型的模板方法模式示例

java 泛型示例如果您发现除了某些部分外&#xff0c;您的许多例程完全相同&#xff0c;那么您可能需要考虑使用Template Method来消除容易出错的代码重复 。 这是一个示例&#xff1a;下面是两个做类似事情的类&#xff1a; 实例化并初始化Reader以从CSV文件读取。 阅读每一行…

vue如何使浏览器url固定_怎么给 vue的 vue-router url地址最后加上 / 斜杠

这样没用 - -应该需要怎么加&#xff1f;router.beforeEach((to, from, next) > {if (!checkJs.getCookie(token) && to.path ! / && to.path ! /resetpassword) {next(/);} else if (checkJs.getCookie(token) && from.path /login || checkJs.ge…

oracle dbstart,dbstart: 未找到命令

oracle 12c在centos最小化下安装后&#xff0c;数据库不随机启动&#xff0c;按照网上的教程&#xff0c;编辑了/etc/oratab文件增加了rc.local文件结果还是不随机启动&#xff0c;通过&#xff1a;systemctl status rc-local.service可以看到服务启动失败&#xff0c;提示如标…

确定Java等价性的新时代?

几个月前&#xff0c;我读了一篇题为“确定Java等价性的新时代&#xff1f;”的博客文章。 这在某种程度上与我当时在我那令人脚的副项目Java :: Geci中开发的内容非常吻合 。 我建议您暂停阅读&#xff0c;阅读原始文章&#xff0c;然后再返回此处&#xff0c;即使您知道一定比…

oracle数据modeling分类,由浅入深 NoSQL的五种主流数据模型

【IT168 技术】本文内容是对《NoSQL Data Modeling Techniques》一文的简单概述&#xff0c;原文对NoSQL的几种数据模型进行了详细深入的讨论。是了解NoSQL数据模型不过错过的全面资料。NoSQL的一些非功能性的特性&#xff0c;比如扩展性、性能以及一致性的讨论&#xff0c;目前…

sklearn svm 调参_网舟科技 | 使用SVM模型进行分类预测时的参数调整技巧

原标题&#xff1a;网舟科技 | 使用SVM模型进行分类预测时的参数调整技巧SVM是一种在小样本低维度下比较适用的非线性建模方法&#xff0c;相对比其他常用的算法(比如决策树)&#xff0c;模型根据调参的好坏所表现的性能波动非常大。当我们决定使用SVM模型&#xff0c;模型的效…

dederss.php美国与,Dede经验:全站rss/连载和分类首页模板替换

我用的是Dedecms55 utf-8建的站。首先感谢开源工作者们的劳动&#xff0c;其次要感谢使用者写的N多问题与解答。我一个PHP初用者&#xff0c;能在一个月内&#xff0c;一个人把酷猫网http://www.92kcuat.com 建成今天这样&#xff0c;相信很多朋友都可以。当遇到问题时&#xf…

物联网协议之COAP简介及Java实践

目录 前言 一、COAP简介 1、关于COAP 2、COAP特点 3、基于COAP的NB-IoT接入流程 二、CoAP协议JAVA实践 1、californium介绍 2、Java集成 3、Maven 资源引入 4、定义Server端 5、Client调用 6、运行测试 总结 前言 今天平安夜&#xff0c;祝大家圣诞快乐&#xff0c…

遗传算法可用什么算法代替_获取可用密码算法的列表

遗传算法可用什么算法代替您如何了解可用的密码算法&#xff1f; Java规范列出了几种必需的密码&#xff0c;摘要等&#xff0c;但是提供程序通常提供的不止这些。 幸运的是&#xff0c;这很容易了解我们系统上的可用内容。 public class ListAlgorithms {public static void…

bp配置 sap_SAP转储订单之 STO without delivery

在《SAP转储订单STO小结》一文中&#xff0c;介绍了存转储订单(STO)的几种方式&#xff0c;在SAP Library中有相应的描述&#xff1a;1 Stock Transfer Between Plants in One Step2 Stock Transfer Between Plants in TwoSteps3 Stock Transport Order Without Delivery4 Stoc…

高效的企业测试–测试框架(5/6)

本系列文章的这一部分将介绍测试框架以及我在何时以及是否应用它们方面的想法和经验。 关于测试框架的思考 我对大多数测试框架不太满意的原因是&#xff0c;按照我的观点&#xff0c;它们大多增加了一些语法上的便利性和便利性&#xff0c;但本质上并不能解决拥有可维护的测…

linux 源码 目录,Linux系统主要目录及kernel源代码目录

1.在安装Linux后&#xff0c;先要了解清楚系统主要目录到底是干什么用的&#xff0c;避免以后再操作上的失误等。下面&#xff0c;就对Linux主要目录做一下简要说明&#xff1a;/boot&#xff1a;系统启动相关的文件&#xff0c;如内核、initrd&#xff0c;以及grub(bootloader…