2016-01-18 1 views
0

Во-первых, я новичок в Vaadin 7. Я только что попробовал демо-версию vaadin, когда обнаружил BeanFieldGroup.class. Как я видел, этот класс привязал поле к свойству bean. В компоненте свойства аннотируются аннотациями ограничений проверки (JSR 303). В этом случае мой pom.xml включают спящий режим валидатор зависимость:Проверка ваадин-бина с помощью Hibernate-валидатора с UTF-8

<dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>5.1.0.CR1</version> 
</dependency> 

я сделал ValidationMessage.properties файл и поместить туда некоторые сообщения, (с венгерскими символов) и он был сохранен формат UTF-8, например:

validation.NotBlank=Árvíztűrő tükörfúrgép 

А вот аннотированный свойство компонента:

@NotNull(message = "{validation.NotBlank}") 
private String name = null; 

Я могу видеть, когда я изменить значение поля NULL, Vaadin показать мне мое предыдущее ограничение ошибки Сообщ e, но с неправильным кодированием символов.

В другой стороны - без Vaadin, но весна, я могу использовать следующую простую формулу где кодирование символов Уместно меня (как вы можете видеть, я использую Spring ReloadableResourceBundleMessageSource):

private MessageSource MessageSource(){ 
    ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource = new ReloadableResourceBundleMessageSource(); 
    reloadableResourceBundleMessageSource.setCacheSeconds(5000); 
    reloadableResourceBundleMessageSource.setFallbackToSystemLocale(false); 
    reloadableResourceBundleMessageSource.setDefaultEncoding("UTF-8"); 
    Properties properties = new Properties(); 
    properties.setProperty("fileEncodings", "UTF-8"); 
    reloadableResourceBundleMessageSource.setFileEncodings(properties); 
    reloadableResourceBundleMessageSource.setBasename("classpath:/locales/messages"); 

    return reloadableResourceBundleMessageSource; 
} 

@Bean 
public LocalValidatorFactoryBean validator(){ 

    LocalValidatorFactoryBean factory = new LocalValidatorFactoryBean(); 
    factory.setValidationMessageSource(MessageSource()); 

    return factory; 
} 

Мой вопрос: Может ли кто-нибудь сказать мне правильное решение, как настроить hibernate validator или Vaadin для чтения файлов свойств с кодировкой UTF-8?

ответ

1

Vaadin's BeanFieldGroup использует другой класс Vaadin BeanValidator для проверки JSR-303. Если вы посмотрите на его исходный код на BeanValidator.getJavaxBeanValidator() и getJavaxBeanValidatorFactory() методах, вы увидите, что он строит свои собственные Validator и ValidatorFactory экземпляров. Вам нужно будет подклассифицировать его и переопределить метод getJavaxBeanValidatorFactory() с использованием метода, который использует ValidatorFactory, полученный из контекста Spring, который настроен правильно, чтобы использовать собственный код UTF-8 от Spring MessageSource, как вы уже настроили его в своем примере. Это также поможет вам с отладкой, поскольку весна MessageSource может быть перезагружена, что является огромной заставкой.

EDIT: следующий вопрос в комментарии о том, как переопределить с подклассов я понял, что с текущим состоянием этой части API Vaadin в версии 7.5.9, я не могу сделать это элегантно. Поскольку мы не можем сделать это изящно, мы могли бы сделать это быстро и грязно, отражая этот хак, выполненный в виде пружинного компонента:

@Component 
public class VaadinValidationHack implements InitializingBean { 

    @Autowired 
    private ValidatorFactory validatorFactory; 

    protected void hack() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { 
     Field field = BeanValidator.class.getDeclaredField("factory"); 
     if (!field.isAccessible()) { 
      field.setAccessible(true); 
     } 
     field.set(null, validatorFactory); 
    } 

    @Override 
    public void afterPropertiesSet() throws Exception { 
     hack(); 
    } 

} 
+0

Hi! Спасибо вашему ответу. Я вас понимаю, но сейчас я не совсем понимаю, как получить экземпляр ValidatorFactory от BeanFieldGroup. Не могли бы вы показать короткий пример? –

+0

Я обновил свой ответ на основе вашего вопроса. –

+0

Я предпочел бы выполнить конфигурацию с помощью дескриптора validation.xml Bean Validation вместо разведывательных хаков.Это настраивает фабрику валидатора по умолчанию, которая также должна быть выбрана Ваадином. – Gunnar

1

По умолчанию для чтения файлов свойств используется ISO-8859-1. Символы, недоступные в этой кодировке, должны быть преобразованы с использованием Unicode escapes ("\ u1234"), например. используя инструмент native2ascii. См. this answer к связанному вопросу для получения более подробной информации.

В качестве альтернативы вы можете подключить пользовательский ResourceBundleLocator, который считывает свойства с использованием кодировки UTF-8. Справочное руководство Hibernate Validator describes как это сделать. В качестве отправной точки вы можете взять PlatformResourceBundleLocator и адаптировать ее согласно вашим требованиям.

 Смежные вопросы

  • Нет связанных вопросов^_^