средство проверки гибернации + jsf 2.0: ValidationMessages.properties в UTF-8 - PullRequest
2 голосов
/ 21 июня 2011

У меня проблема с отображением пользовательских сообщений Validation Hibernate Validator в UTF-8.

Для обычных сообщений jsf я следовал этому совету: i18n с файлами свойств в кодировке UTF-8 в приложении JSF 2.0 - я создал класс Text и использовал его в face-config.xml.Это работает правильно.

Но этот подход не работает с ValidationMessages;специальные символы не отображаются в UTF-8.

Может ли кто-нибудь дать мне совет по этому поводу?Большое спасибо

Ответы [ 2 ]

0 голосов
/ 09 октября 2015

Если вы используете такой же Resource-Bundle, как в https://stackoverflow.com/a/3646601/5072526,, вы можете сделать это:

Измените ResourceBundle из этого ответа, чтобы у вас был дополнительный конструктор, который принимает локаль:

public I18NUtf8RessourceBundle(Locale locale) {
    setParent(ResourceBundle.getBundle(BUNDLE_NAME, 
            locale, UTF8_CONTROL));
}

Затем создайте класс ValidationMessages в пакете по умолчанию:

public class ValidationMessages extends I18NUtf8RessourceBundle{
   public ValidationMessages() {
        super(null);
    }
}

Затем создайте тот же класс с определенной локалью (_en, _de и т. Д.):

public class ValidationMessages_en extends I18NUtf8RessourceBundle{
    public ValidationMessages_en() {
        super(Locale.ENGLISH);
    }
}

Сделайте то же самое для всех ваших языков и каждый раз передавайте разные локали:

При этом все работает, вы даже можете иметь тот же файл для сообщений проверки, что и для обычных переводов!

0 голосов
/ 07 августа 2014

Я решил так же. Валидатор Hibernate имеет файл конфигурации в META-INF / validation.xml

Пример для validation.xml

<validation-config xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration">
    <message-interpolator>com.mycompany.validation.utf8.UTF8ResourceBundleMessageInterpolator</message-interpolator>
</validation-config>

Реализация для UTF8ResourceBundleMessageInterpolator

public class UTF8ResourceBundleMessageInterpolator extends ResourceBundleMessageInterpolator {

    public UTF8ResourceBundleMessageInterpolator() {
        super(new UTF8ResourceBundleLocator(ResourceBundleMessageInterpolator.USER_VALIDATION_MESSAGES));
    }
}

Реализация для UTF8ResourceBundleLocator (клон класса PlatformResourceBundleLocator с небольшим исправлением)

public class UTF8ResourceBundleLocator implements ResourceBundleLocator {
    private static final Logger logger = LoggerFactory.getLogger(UTF8ResourceBundleLocator.class);

    protected static final ResourceBundle.Control UTF8_CONTROL = new UTF8Control();

    private final String bundleName;

    public UTF8ResourceBundleLocator(String bundleName) {
        this.bundleName = bundleName;
    }


    /**
     * Search current thread classloader for the resource bundle. If not found,
     * search validator (this) classloader.
     *
     * @param locale The locale of the bundle to load.
     * @return the resource bundle or <code>null</code> if none is found.
     */
    @Override
    public ResourceBundle getResourceBundle(Locale locale) {
        ResourceBundle rb = null;
        ClassLoader classLoader = GetClassLoader.fromContext();
        if (classLoader != null) {
            rb = loadBundle(
                    classLoader, locale, bundleName
                            + " not found by thread local classloader"
            );
        }
        if (rb == null) {
            classLoader = GetClassLoader.fromClass(PlatformResourceBundleLocator.class);
            rb = loadBundle(
                    classLoader, locale, bundleName
                            + " not found by validator classloader"
            );
        }

        return rb;
    }

    private ResourceBundle loadBundle(ClassLoader classLoader, Locale locale, String message) {
        ResourceBundle rb = null;
        try {
            rb = ResourceBundle.getBundle(
                    bundleName, locale,
                    classLoader, UTF8_CONTROL
            );
        } catch (MissingResourceException ignored) {
            logger.trace(message);
        }
        return rb;
    }

    private static class GetClassLoader implements PrivilegedAction<ClassLoader> {
        private final Class<?> clazz;

        private static ClassLoader fromContext() {
            final GetClassLoader action = new GetClassLoader(null);
            if (System.getSecurityManager() != null) {
                return AccessController.doPrivileged(action);
            } else {
                return action.run();
            }
        }

        private static ClassLoader fromClass(Class<?> clazz) {
            if (clazz == null) {
                throw new IllegalArgumentException("Class is null");
            }
            final GetClassLoader action = new GetClassLoader(clazz);
            if (System.getSecurityManager() != null) {
                return AccessController.doPrivileged(action);
            } else {
                return action.run();
            }
        }

        private GetClassLoader(Class<?> clazz) {
            this.clazz = clazz;
        }

        @Override
        public ClassLoader run() {
            if (clazz != null) {
                return clazz.getClassLoader();
            } else {
                return Thread.currentThread().getContextClassLoader();
            }
        }
    }
}

Где UTF8Control класс - это класс i18n с файлами свойств в кодировке UTF-8 в приложении JSF 2.0

...