javascript
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 自定義消息
總結
以上是生活随笔為你收集整理的jsr303 自定义消息_JSR 303从I18N属性文件加载消息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年高性价比平板电脑推荐2021年
- 下一篇: 三大平台旗舰平板对比三大平台旗舰平板对比