3

親愛なる春のコミュニティ、

私が実装しようとしているのは次のとおりです。

  • コントローラーごとにカスタムバリデーターが欲しい(経由@InitBinder
  • Springに電話してもらいたいvalidator.validate()この方法ではない
  • @ValidそのためにJSR-303アノテーションを使用したいと思います
  • 検証されるBean(RegistrationForm)には、フィールドごとのJSR-303アノテーションがありません。
  • クラスパスに検証実装( Hibernateなど)を含めたくありません。上記のステートメントのように役に立たないでしょう

私は基本的にここに記載されている手順に従います:

  • javax.validation.validation-api:validation-api依存関係として追加します
  • 私が使う<mvc:annotation-driven />
  • モデルに次のマークを付けます@Validpublic String onRegistrationFormSubmitted(@ModelAttribute("registrationForm") @Valid RegistrationForm registrationForm, BindingResult result) ...

つまり、検証APIは実装を見つけようとして失敗します。

Caused by: javax.validation.ValidationException: Unable to find a default provider
    at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:264)
    at org.springframework.validation.beanvalidation.LocalValidatorFactoryBean.afterPropertiesSet(LocalValidatorFactoryBean.java:183)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)

validator解決策は、次のプロパティを定義することですAnnotationDrivenBeanDefinitionParser

<bean name="validator" class="org.company.module.RegistrationFormValidator" />

<mvc:annotation-driven validator="validator" />

ただし、このアプローチは、バリデーターがによってすべてのコントローラーに設定されることを意味しConfigurableWebBindingInitializer.initBinder()ます。

validator私はフレームワークを特別な方法で使用しようとしていることを理解していますが、バリデーターを解決する必要がないことを示すプロパティに特別な意味がある場合、コミュニティは何を言いますか?

<mvc:annotation-driven validator="manual" />

特別な扱いで:

--- AnnotationDrivenBeanDefinitionParser.java.orig      2011-06-30 14:33:10.287577300 +0200
+++ AnnotationDrivenBeanDefinitionParser.java   2011-06-30 14:34:27.897449000 +0200
@@ -152,6 +152,10 @@

        private RuntimeBeanReference getValidator(Element element, Object source, ParserContext parserContext) {
                if (element.hasAttribute("validator")) {
+                       if ("manual".equals(element.getAttribute("validator"))) {
+                               return null;
+                       }
+
                        return new RuntimeBeanReference(element.getAttribute("validator"));
                }
                else if (jsr303Present) {

フィードバックを歓迎します。

春のフォーラムからのPS再投稿。

4

3 に答える 3

2

これは、上記のフォーラムでの私の回答/回避策の再投稿でもあります。とにかく、ここでも役立つかもしれないと思います。

私が見つけた唯一の回避策は@Valid、Spring(少なくとも3.1.1.RELEASEコードベースでは)がメソッド引数アノテーションの単純な名前のみをチェックするようになったら、独自のアノテーションを実装することでした(以下のorg.springframework.web.method.annotation.ModelAttributeMethodProcessorクラスを調べてください)。このように、プロジェクトの依存関係を追加する必要がjavax.validation.validation-api:validation-apiなく、悪名高いものを取得するのをやめjavax.validation.ValidationException: Unable to find a default providerます。

/**
 * Validate the model attribute if applicable.
 * <p>The default implementation checks for {@code @javax.validation.Valid}.
 * @param binder the DataBinder to be used
 * @param parameter the method parameter
 */
protected void validateIfApplicable(WebDataBinder binder, MethodParameter parameter) {
    Annotation[] annotations = parameter.getParameterAnnotations();
    for (Annotation annot : annotations) {
        if (annot.annotationType().getSimpleName().startsWith("Valid")) {
            Object hints = AnnotationUtils.getValue(annot);
            binder.validate(hints instanceof Object[] ? (Object[]) hints : new Object[] {hints});
        }
    }
}
于 2012-04-22T22:42:24.260 に答える
1

Hibernate Validatorを含めたくないのはなぜですか?JSR仕様にはいくつかの実装がありますが、実装(またはプロバイダー)がないと仕様を操作できません。

JDBCドライバーなしでJDBCを操作することを想像できますか?プロバイダーなしでJPAを使用していますか?コンテナなしでサーブレットを操作しますか?

同じです。HibernateValidatorはJSR-303のリファレンス実装です。他の実装については知りませんが、Hibernate Validatorが気に入らない場合は、別の実装を選択してください。

于 2012-04-22T21:19:28.730 に答える
0

あなたが書いた:

依存関係としてjavax.validation.validation-api:validation-apiを追加します...

原因:javax.validation.ValidationException:デフォルトのプロバイダーが見つかりません

また、そのAPIの実装も必要になります。たとえば、Hibernate Validatorは、デフォルトの実装です。(ORM Hibernateとは何の関係もありません)

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>4.2.0.Final</version>
</dependency>
于 2012-04-22T21:12:16.283 に答える