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 自定义消息

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

  1. JSR 303从I18N属性文件加载消息

    总览 本文将说明如何适应JSR 303验证API来从I18n属性文件加载消息,并通过保留国际化的所有好处和对多种语言的支持来实现这一点. 为此,我们将实现一个基于Spring API的自定义Messa ...

  2. java 从xml读变量_java – 如何从XML属性文件加载变量?

    我目前正在从Ant中的XML文件加载属性.但是,我想在for循环中执行当前的ant任务,同时每次为同一组属性加载新的XML属性文件. 我知道ant-contrib的var任务的存在,它允许我覆盖属性. ...

  3. 高性能javascript 文件加载阻塞

    高性能javascript javascript脚本执行过程中会中断页面加载,直到脚本执行完毕,此操作阻塞了页面加载,造成性能问题.   脚本位置和加载顺序: 如果将脚本放在head内,那么再脚本执行 ...

  4. extjs 文件加载、解析流程

    extjs版本:4.2.1 在html中添加应用的启动脚本,如下: <script src="app.js"></script> 2. 用户访问html的时 ...

  5. java yml value_Spring Boot:从YAML文件加载@Value

    我需要从 .yml 文件加载一个属性,该文件包含应用程序可以从中读取文件的文件夹的路径 . 我正在使用以下代码注入属性: @Value("${files.upload.baseDir}&qu ...

  6. Three.js(十四)—— 模型文件加载

    文章目录 14.Three.js 加载外部模型文件 14.1 Three.js 数据结构.导入导出 Threejs导出模型信息 自定义模型加载器文件 加载Three.js导出的模型数据 14.2 加载 ...

  7. Objective-C学习笔记第十五章文件加载与保存

    第十五章文件加载与保存 Cocoa提供了Core Data,他能在后台处理所有文件内容 Cocoa提供了两个通用的文件处理类:属性列表和对象编码 一.属性列表类 在Cocoa中,有一类名为属性列表的对 ...

  8. 怎么判断一个JS文件加载完成?

    在正常的加载过程中,js的加载都是同步的,也就是说在加载过程中,浏览器会阻塞接下来的内容的加载.这时候我们就要用到动态加载,动态加载是异步的,如果我们在后边要用到这个动态加载的js文件里的东西,就要保 ...

  9. RocketMQ源码(4)—Broker启动加载消息文件以及恢复数据源码【一万字】

    详细介绍了Broker启动加载消息文件以及恢复数据源码. 此前我们学习了Broker的启动源码:RocketMQ源码(3)-Broker启动流程源码解析[一万字],Broker的启动过程中,在Defa ...

最新文章

  1. JS实现每隔几个字符添加字符(串):实现每间隔10个字就换行一次,多用于echarts横坐标的显示文本拥挤换行;实现间隔8个字符就添加❤❤
  2. 漫话:如何给女朋友解释为什么计算机中 0.2 + 0.1 不等于 0.3 ?
  3. 某县百姓百事110便民服务管理系统(1)——项目总结
  4. Android WebRTC视频旋转问题
  5. boost::range模块实现map_values相关的测试程序
  6. H5在WebView上开发小结
  7. 软件工程---16.基于构件的软件工程
  8. iOS开发之解决系统数字键盘无文字时delete键无法监听的技巧
  9. 终于有人把幸存者偏差讲明白了
  10. 在quartusii如何设计出一个 3 位的十进制加法计数器的原理以及它的设计电_从算盘到计算机,从十进制到二进制,人类计算能力的提升...
  11. Hibernate中Criteria的完整用法
  12. 什么是灰度发布?灰度发布方式 系统的割接 灰度部署典型的框架架构
  13. 标准地形图制作系列--接图表的制作方法
  14. matlab repmat 函数的使用
  15. 如何在苹果 M1 上安装使用 FL Studio
  16. 通过FISH和下一代测序检测肺腺癌ALK基因融合比较
  17. AES16位密钥加密解密
  18. UBUNTU-19.04的拼音输入法
  19. 京东商城(mysql+python)
  20. 缓存穿透、击穿、雪崩什么的分不清楚?看了这篇文章后,我明白了

热门文章

  1. Simple-Faster-RCNN源码学习笔记
  2. JavaFX仿windows文件管理器目录树
  3. 一次堆外内存泄露的排查过程
  4. 你必须掌握的 21 个 Java 核心技术
  5. 对Java的URL类支持的协议进行扩展的方法
  6. 坑爹的日志无法按天切割问题
  7. 并发编程 – Concurrent 用户指南
  8. 精选30道Java多线程面试题
  9. 【Mysql】win10上Mysq的l安装
  10. 今天是个特殊的一天,有意义的一天,值得纪念的一天~