【问题标题】:GWT and Hibernate ValidatorGWT 和 Hibernate 验证器
【发布时间】:2012-01-26 08:42:27
【问题描述】:

我在使用带有 GWT 2.4 的 Hibernate Validator 时遇到问题。模块启动时出现错误:

00:00:05,562 [错误] 延迟绑定结果类型 'javax.validation.ValidatorFactory' 不应该是抽象的

java.lang.RuntimeException:延迟绑定失败 'javax.validation.ValidatorFactory'(你忘了继承一个 需要的模块?) ...

模块配置:

<module rename-to='start'>
  ...
  <inherits name="com.google.gwt.validation.Validation" />
  <!-- with this doesn't work too 
  <inherits name="org.hibernate.validator.HibernateValidator" />
  -->
  ...
</module>

入口点:

public class Start implements EntryPoint {
    public void onModuleLoad() {

        final ValidatorFactory factory = Validation.byDefaultProvider().configure().buildValidatorFactory();
        ...
    }
}

pom.xml

<dependency>
  <groupId>javax.validation</groupId>
  <artifactId>validation-api</artifactId>
  <version>1.0.0.GA</version>
</dependency>
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>4.2.0.Final</version>
</dependency>

【问题讨论】:

    标签: gwt gwt-2.4


    【解决方案1】:

    解决了这个问题!
    根据http://code.google.com/p/google-web-toolkit/wiki/BeanValidation,我必须实现自定义MyValidatorFactory 并添加到项目hibernate-validator 源.jar。

    GWT 模块配置:

    <!-- hibernate validator -->
    <inherits name="org.hibernate.validator.HibernateValidator" />
    <replace-with class="net.marioosh.gwt.client.MyValidatorFactory">
      <when-type-is class="javax.validation.ValidatorFactory" />
    </replace-with>
    

    我的验证器工厂

    package net.marioosh.gwt.client;
    
    import javax.validation.Validator;
    import net.marioosh.gwt.shared.model.entities.Link;
    import com.google.gwt.core.client.GWT;
    import com.google.gwt.validation.client.AbstractGwtValidatorFactory;
    import com.google.gwt.validation.client.GwtValidation;
    import com.google.gwt.validation.client.impl.AbstractGwtValidator;
    
    public class MyValidatorFactory extends AbstractGwtValidatorFactory {
    
        /**
         * Only the classes listed in the {@link GwtValidation} annotation can be validated.
         * In my example: Link.class can be validated
         */
        @GwtValidation(value = { Link.class })
        public interface GwtValidator extends Validator {
        }
    
        @Override
        public AbstractGwtValidator createValidator() {
            return GWT.create(GwtValidator.class);
        }
    
    }
    

    还需要 Hibernate 验证器源

    <!-- local dependency -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator-sources</artifactId>
        <version>4.2.0.Final</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/hibernate-validator-4.2.0.Final-sources.jar</systemPath>
    </dependency>       
    

    使用:

    public void onModuleLoad() {
        final ValidatorFactory factory = Validation.byDefaultProvider().configure().buildValidatorFactory();
        final Validator validator = factory.getValidator();
        ...
    
        Link l = new Link(....);
        Set<ConstraintViolation<Link>> violations = validator.validate(l);
    
        if(!violations.isEmpty()) {
               // validation fail
        } else {
               // validation success
        }
        ...
    }
    

    【讨论】:

    • 这在客户端和服务器端都有效吗?它是否正确地插入带有国际化的消息?
    【解决方案2】:

    上次我尝试做这项工作时,我非常头疼,并决定自己实现基于 JSR303 标准的 GWT 验证框架。

    无论如何,这仍然是一个实验性框架,如 Wiki 中所述:

    http://code.google.com/p/google-web-toolkit/wiki/BeanValidation

    警告 实验性的。 API 可能会更改。有些事情仍然无法正常工作。

    所以,如果我是你,我不会试图让它发挥作用。自己实现一些能够验证您的类的生成器。

    我在这里也试过这个框架:

    http://code.google.com/p/gwt-validation/

    ...但是再一次,完全没能使它对我有用!但是根据您的情况,它可能会正常工作...尝试制作一个“非常”小的应用程序来测试不同的方法,看看哪种方法适合您。

    【讨论】:

      猜你喜欢
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多