【问题标题】:Validation Exception: unable to find default provider, Android验证异常:无法找到默认提供程序,Android
【发布时间】:2014-02-28 02:34:28
【问题描述】:

我在使用 Android 的 bean 验证时遇到问题。我已将验证 api 和休眠验证器 4.0.1 包含到 libs 和 assets 文件夹中。验证输入的代码如下

/* This doesn't work either
 * 
 * ValidatorFactory factory = Validation
 *      .byProvider(HibernateValidator.class).configure()
 *      .buildValidatorFactory();
 */

    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();

    Validator validator = factory.getValidator();
    Set<ConstraintViolation<Class<Department>>> violations = validator
            .validate(Department.class);

    for (ConstraintViolation<Class<Department>> v : violations) {
        // do something useful
    }

我收到一个 ValidationException,它指出未找到默认提供程序。注释部分也不起作用。它还会抛出 ValidationException,说明它无法找到提供程序 org.hibernate.validator.HibernateValidator。

02-04 07:44:22.388: E/AndroidRuntime(946): Caused by: javax.validation.ValidationException: Unable to find provider: class org.hibernate.validator.HibernateValidator
02-04 07:44:22.388: E/AndroidRuntime(946):  at javax.validation.Validation$ProviderSpecificBootstrapImpl.configure(Validation.java:223)
02-04 07:44:22.388: E/AndroidRuntime(946):  at com.example.testapp.MainActivity.validate(MainActivity.java:51)
02-04 07:44:22.388: E/AndroidRuntime(946):  at com.example.testapp.MainActivity.anlegen(MainActivity.java:46)
02-04 07:44:22.388: E/AndroidRuntime(946):  ... 14 more

我在配置时是否遗漏了什么?还是hibernate不适用于android?

更新

我尝试按照@Gunnar 的建议实施 ValidatorProviderResolver。代码改为:

HibernateValidatorConfiguration config = Validation
            .byProvider(HibernateValidator.class)
            .providerResolver(new MyAndroidValidationProviderResolver())
            .configure();
ValidatorFactory factory = config.buildValidatorFactory();
Validator v = factory.getValidator();

现在我得到如下异常:

02-05 20:21:36.642: E/AndroidRuntime(792): Caused by: java.lang.IllegalArgumentException: Invalid logger interface org.hibernate.validator.internal.util.logging.Log (implementation not found)
02-05 20:21:36.642: E/AndroidRuntime(792):  at org.jboss.logging.Logger.getMessageLogger(Logger.java:2250)
02-05 20:21:36.642: E/AndroidRuntime(792):  at org.jboss.logging.Logger.getMessageLogger(Logger.java:2214)
02-05 20:21:36.642: E/AndroidRuntime(792):  at org.hibernate.validator.internal.util.logging.LoggerFactory.make(LoggerFactory.java:29)
02-05 20:21:36.642: E/AndroidRuntime(792):  at org.hibernate.validator.internal.util.Version.<clinit>(Version.java:27)
02-05 20:21:36.642: E/AndroidRuntime(792):  ... 21 more

我还切换到 Hibernate 5.0.3 final,包括所有库(必需和可选)。

【问题讨论】:

  • 您要添加哪个版本的 Bean 验证?我不是 Android 专家,但我想知道 Java ServiceLoader 方法是否完全适用于 Android(通过 META-INF/services)。这就是 Validation 尝试引导 ValidationProvider 的方式。 Android 上的 META-INF 没有限制吗?
  • 我正在使用验证 API 版本 1.1 This topic 似乎解决了同样的问题,但我不明白问题是如何解决的。
  • 这个想法是写你自己的ValidationProviderResolver,它只返回HibernateValidator,所以你不需要依赖默认使用的服务加载器机制(正如哈迪所说,这在Android上不起作用)。
  • > 我还切换到 Hibernate 5.0.3 final,包括所有库(必需的和可选的)。你能列出你正在添加的人工制品吗?根据消息 JBoss logger 找不到 Hibernate Validator 的 Log 接口。不过这似乎很奇怪。
  • 似乎在将 jars 放置到 /libs Android SDK 时会删除不符合给定名称模式的类。之后缺少 Log 接口 Log_$logger 所需的 impl。将其从 jar 中剥离并手动添加到 /bin 会导致 dex 加载器崩溃并显示以下消息:无法执行 dex:多个 dex 文件定义 Lorg/hibernate/validator/internal/util/logging/Log_$logger;跨度>

标签: android hibernate validation bean-validation


【解决方案1】:

org.hibernate.validator.internal.util.logging.Log 接口使用 Android 不支持的 2 个类: javax.xml.bind.JAXBException 和 javax.xml.stream.XMLStreamException。这就是没有加载类的原因。

【讨论】:

    猜你喜欢
    • 2011-01-14
    • 2023-03-29
    • 2011-10-14
    • 2012-04-04
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    相关资源
    最近更新 更多