2014-08-27 84 views
2

我和春天(4.0.5)和Hibernate验证工作(5.1.2.Final)编码Hibernate验证自定义错误消息配置通过Spring框架

我已经通过属性文件工作中的错误消息,它也适用于i18n

  • 它在独立测试(JUnit的)环境中,由时刻。我不想包含Web环境,但仍然保持简单。

我有以下几点:

对于ValidationMessages_es_PE.properties文件(西班牙文)

person.salary.digits=Dato invalido '${validatedValue}', máximo tamaño no decimal permitido es {integer}, máximo tamaño decimal permitido es {fraction} 

关于基础设施

@Configuration 
public class ValidatorConfiguration { 

    @Bean 
    public ResourceBundleMessageSource resourceBundleMessageSource(){ 
     ResourceBundleMessageSource resourceBundleMessageSource = new ResourceBundleMessageSource(); 
     resourceBundleMessageSource.setDefaultEncoding("UTF-8"); 
     resourceBundleMessageSource.setBasenames("com.manuel.jordan.validation.messages.ValidationMessages"); 
     return resourceBundleMessageSource; 
    } 

    @Bean 
    public LocalValidatorFactoryBean localValidatorFactoryBean(){ 

LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean(); 
     localValidatorFactoryBean.setValidationMessageSource(resourceBundleMessageSource()); 

     MessageSourceResourceBundleLocator messageSourceResourceBundleLocator = new MessageSourceResourceBundleLocator(resourceBundleMessageSource()); 
     ResourceBundleMessageInterpolator resourceBundleMessageInterpolator = new ResourceBundleMessageInterpolator(messageSourceResourceBundleLocator); 
     localValidatorFactoryBean.setMessageInterpolator(resourceBundleMessageInterpolator); 

     return localValidatorFactoryBean; 
    } 


} 

观察我setDefaultEncoding("UTF-8")

测试类

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes=ValidatorConfiguration.class) 
public class InvalidPersonValidation03Test { 

    private static final Logger logger = LoggerFactory.getLogger(InvalidPersonValidation03Test.class); 

    @Autowired 
    private LocalValidatorFactoryBean validator; 

    public InvalidPersonValidation03Test(){ 
     LocaleContextHolder.setLocale(new Locale("es","PE")); 
    } 

    @Test 
    public void testInvalidNullId(){ 
    ... 

部分输出的是以下

- >>>testInvalidFractionSalary 
- ConstraintViolationImpl{interpolatedMessage='Dato invalido '1578.100', m�ximo tama�o no decimal permitido es 4, m�ximo tama�o decimal permitido es 2', propertyPath=salary, rootBeanClass=class com.manuel.jordan.domain.PersonValidation03, messageTemplate='{person.salary.digits}'} 
- ConstraintViolationImpl{interpolatedMessage='Dato invalido '1578.100', m�ximo tama�o no decimal permitido es 4, m�ximo tama�o decimal permitido es 2', propertyPath=salary, rootBeanClass=class com.manuel.jordan.domain.PersonValidation03, messageTemplate='{person.salary.digits}'} 

字符ñá没有显示它是如何预计

我的IDE已经

Preferences -> Workspace -> Text file encodingUTF-8

我需要多少额外的缺失配置?

+0

尝试设置'-Dfile.encoding = utf-8'到服务器。 – 2014-08-27 15:29:20

+0

谢谢,我应该在哪里应用?我尝试了'VM参数'或'程序参数'中的'JUnit-> Run Configurations - > Arguments'以及相同的错误结果。 – 2014-08-27 15:34:41

回答

1

您不能在属性文件中使用这样的unicode字符。见http://docs.oracle.com/javase/8/docs/api/java/util/PropertyResourceBundle.html

在这种情况下,不能在ISO-8859-1 编码表示字符必须使用Unicode转义被表示为Java™语言规范的部分 3.3定义...

A将被\ u00E1和n \ u00F1

+0

一些奇怪的东西,我有其他项目与西班牙语和葡萄牙语的.properties工作,所有的工作正常,现在的问题是,唯一的区别是,现在我正在与Hibernate验证工作.. – 2014-08-28 13:42:51

+0

也许你知道一个工具,让我尽快完成转换?用转换的数据创建一个新的文件?当然保留旧的。谢谢 – 2014-08-28 13:44:04

+1

nativetoascii,它是JDK的一部分。另见http://stackoverflow.com/questions/4659929/how-to-use-utf-8-in-resource-properties-with-resourcebundle – Hardy 2014-08-28 18:04:34