親愛なる春のコミュニティ、
私が実装しようとしているのは次のとおりです。
- コントローラーごとにカスタムバリデーターが欲しい(経由
@InitBinder
) - Springに電話してもらいたい
validator.validate()
(この方法ではない) @Valid
そのためにJSR-303アノテーションを使用したいと思います- 検証されるBean(
RegistrationForm
)には、フィールドごとのJSR-303アノテーションがありません。 - クラスパスに検証実装( Hibernateなど)を含めたくありません。上記のステートメントのように役に立たないでしょう
私は基本的にここに記載されている手順に従います:
javax.validation.validation-api:validation-api
依存関係として追加します- 私が使う
<mvc:annotation-driven />
- モデルに次のマークを付けます
@Valid
:public 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再投稿。