【发布时间】: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