2014-02-04 5 views
2

У меня возникла проблема с использованием проверки 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 окончательным включая ВСЕ библиотеки (необходимые, а также по желанию).

+0

Какую версию проверки боба вы добавляете? Я не специалист по Android, но мне интересно, работает ли подход Java ServiceLoader на Android вообще (через META-INF/services). Именно так Validation пытается загружать _ValidationProvider_. Существуют ли какие-либо ограничения в отношении META-INF на Android? – Hardy

+0

Я использую проверку API версии 1.1 [Этот вопрос] (http://stackoverflow.com/questions/19551882/jsr-303-compatible-bean-validator-for-android), похоже, затрагивает ту же проблему, но я дона Не знаю, как решить проблему. –

+1

Идея состоит в том, чтобы написать собственный 'ValidationProviderResolver', который просто возвращает' HibernateValidator', поэтому вам не нужно полагаться на механизм загрузчика службы, используемый по умолчанию (поскольку Харди говорит, что он не работает на Android). – Gunnar

ответ

1

Интерфейс org.hibernate.validator.internal.util.logging.Log использует 2 класса, не поддерживаемые Android: javax.xml.bind.JAXBException и javax.xml.stream.XMLStreamException. Вот почему класс не загружен.

Смежные вопросы