Каков правильный способ проверки запросов с помощью Resteasy?

Я использую Resteasy в сочетании с Google Guice, используя Resteasy-Guice. Я искал способы проверить мои тела запросов. Я хочу сделать например:

public static class MyPojo {

   @NotEmpty private String contents;

}

а затем использовать в моем ресурсе

@POST
@ValidateRequest
public void doPost(@Valid MyPojo myPojo) {
   // use myPojo only if valid
}

Я работал с поставщиком resteasy-hibernate-validator. Но поскольку я переключился на более новые версии, это ввело (нежелательное?) зависимость от EJB. См. также: RESTEASY-1056. В комментариях указано, что вы должны вместо этого переключитесь на более новый валидатор-11:

переключитесь на resteasy-validator-provider-11, который реализует более новую спецификацию Bean Validation 1.1.

на docs говорят:

проверка включена по умолчанию (при условии, что resteasy-validator-provider-11 -.jar доступен), хотя проверка параметров и возвращаемых значений может быть отключена или изменена при проверке.файл конфигурации xml. Увидеть гибернации Документация валидатора для деталей.

мне, однако, не удается заставить это работать в моей конфигурации, потому что я нахожу себя включающим зависимости, такие как hibernate-validator, javax.el-api, javax.el и hibernate-validator-cdi и аннотации как ValidateOnExecution. Однако я не нахожу, что какой-либо из этих экземпляров или недействительных запросов отклоняется.

каков предпочтительный, легкий и рабочий способ проверки с помощью Resteasy?

2 ответов


вам не нужно указывать аннотации на самом ресурсе или выполнять дополнительную настройку. Просто аннотации ограничений на POJOs достаточно, чтобы он работал.

моя установка выглядит следующим образом:

ресурсный метод:

@POST
public void doPost(@Valid MyPojo myPojo) {
   // use myPojo only if valid
}

POJO:

public static class MyPojo {
   @NotEmpty private String contents;
}

протестировано со следующими зависимостями:

javax.validation версия 1.1.0.Final

resteasy-validator-provider-11 версия 3.0.11.Final

hibernate-validator версия 5.0.0.Final и 5.0.1.Final


  • у меня случайно была транзитивная зависимость от hibernate-validator-provider что вызвало предыдущие попытки потерпеть неудачу. Убедитесь, что у вас нет транзитивной зависимости от hibernate-validator-provider. Для меня это вызвало следующее исключение: issues.jboss.org/browse/RESTEASY-826 - ...
  • на основе Томаса ответ я добавил зависимостей для javax.validation, resteasy-validator-provider-11, hibernate-validator.
  • тогда я все еще получал исключения (java.lang.NoClassDefFoundError: javax/el/PropertyNotFoundException). На основе этой ответ, который я добавил javax.el-api и el-impl в качестве зависимостей. Я думаю, это потому, что я использую встроенный контейнер сервлетов.
  • мне пришлось удалить @ValidateOnRequest аннотации на ресурсах, они больше не нужны

последняя рабочая конфигурация:

    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>1.1.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-validator-provider-11</artifactId>
        <version>3.0.11.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.0.1.Final</version>
    </dependency>
    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>el-impl</artifactId>
        <version>2.2</version>
    </dependency>