Проверка на нарушение GWT на стороне сервера вызывает исключение SerializationException

#validation #gwt

#проверка #gwt

Вопрос:

Я следовал образцу проверки gwt 2.4 и внедрил все это в свое собственное приложение. Клиентская сторона работает отлично.

     private void verifyRegistrationData(final RegistrationTO registration) throws ConstraintViolationException {
        final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
        final Set<ConstraintViolation<RegistrationTO>> violations = validator.validate(registration);

        if (violations.size() > 0) {
            final Set<ConstraintViolation<?>> temp = new HashSet<ConstraintViolation<?>>(violations);
            throw new ConstraintViolationException(temp);
        ...
 

но если я сделаю то же самое на стороне сервера:

     public void update(final RegistrationTO registration) throws IllegalArgumentException, ConstraintViolationException, TestException {
    final Set<ConstraintViolation<RegistrationTO>> violations = validator.validate(registration);
    if (!violations.isEmpty()) {
        final Set<ConstraintViolation<?>> temp = new HashSet<ConstraintViolation<?>>(violations);
        throw new ConstraintViolationException(temp);
    }
    ...
 

все это приводит к сбою со следующим исключением:
javax.servlet.Журнал ServletContext: исключение при отправке входящего RPC-вызова
com.google.gwt.user.client.rpc.SerializationException: введите ‘org.hibernate.validator.engine.PathImpl’ не был включен в набор типов, которые могут быть сериализованы этой SerializationPolicy, или его объект класса не может быть загружен. В целях безопасности этот тип не будет сериализован.

Вот как выглядит PathImpl hibernate-validator-4.1.0.Final-sources.jar

 public class PathImpl implements Path, Serializable {
    private static final long serialVersionUID = 7564511574909882392L;
    ...
 

выглядит нормально (по крайней мере, для меня)

Я использую GWT 2.4, validation-api-1.0.0.GA , спящий режим-валидатор-4.1.0.Окончательный, gwt-сервлет-deps …

Заранее спасибо!

Комментарии:

1. Добро пожаловать в неопределенный мир GWT-RPC. Переключитесь на RequestFactory, когда еще есть время, это совет.

Ответ №1:

Существует ли явно определенный конструктор по умолчанию? т.е. public PathImpl() { } ? Это требуется механизмом сериализации GWT; если этого нет в исходном коде, сериализация ответа RPC завершится неудачей.

Комментарии:

1. Sh … — нет. Конструктор по умолчанию является закрытым. Проблема в том, что PathImpl исходит из hibernate-validation-4.1.0.Final.jar

2. Затем вам нужно создать свой собственный класс, который расширяет режим гибернации PathImpl . Это ваша проблема.

Ответ №2:

Пользовательский сериализатор существует для PathImpl , просто, если на этот класс явно не указано в вашем service API, он не будет добавлен в политику сериализации.

Текущая работа заключается в добавлении фиктивного PathImpl поля где-нибудь в вашем сервисном API. ValidationSupport Класс существует для группировки этого и других подобных классов вместе, чтобы сделать это немного проще.

Ответ №3:

Я меняю все это на RequestFactory, как рекомендовал Томас Бройер. Это было далеко не так просто, как GWT-RPC. Это стало причиной для меня собрать всю информацию и создать пример программы.

Для тех, кто заинтересован — здесь вы можете найти образец с документацией и исходным кодом. (Также реализован однострочный клиентский регистратор) (Документация на немецком языке, но ведение журнала-выход aso. на английском языке …)