У меня возникла проблема с использованием проверки bean-компонентов с Android. Я включил проверку api и hibernate validator 4.0.1 в папку libs и assets. Код для подтверждения ввода является следующейПроверка Исключение: не удалось найти поставщика по умолчанию, Android
/* 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
Я пропустил что-то во время настройки? Или спящий режим не применим для Android?
UPDATE
Я пытался реализовать ValidatorProviderResolver как предложено @Gunnar. Код изменен:
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 окончательным включая ВСЕ библиотеки (необходимые, а также по желанию).
Какую версию проверки боба вы добавляете? Я не специалист по Android, но мне интересно, работает ли подход Java ServiceLoader на Android вообще (через META-INF/services). Именно так Validation пытается загружать _ValidationProvider_. Существуют ли какие-либо ограничения в отношении META-INF на Android? – Hardy
Я использую проверку API версии 1.1 [Этот вопрос] (http://stackoverflow.com/questions/19551882/jsr-303-compatible-bean-validator-for-android), похоже, затрагивает ту же проблему, но я дона Не знаю, как решить проблему. –
Идея состоит в том, чтобы написать собственный 'ValidationProviderResolver', который просто возвращает' HibernateValidator', поэтому вам не нужно полагаться на механизм загрузчика службы, используемый по умолчанию (поскольку Харди говорит, что он не работает на Android). – Gunnar