2009-07-30 45 views
1

私は春MVCを使用しており、javascriptにデフォルトのバリデータを公開したいと考えています。 私は共通の抽象クラスと共通インタフェースを実装している多数のバリデータを拡張しているコントローラをたくさん持っています。 (FooController.validatorがFooValidatorのインスタンスになるように)私は、自動的にrespectivellyそれぞれ具体的なコントローラのバリデータフィールドを設定したい春の自動動的バインド

public abstract class AbstractController { 
protected Validator validator; 
} 

public class FooController extends AbstractController{} 
public class BarController extends AbstractController{} 

public interface Validator {} 
public class FooValidator implementes Validator{} 
public class BarValidator implementes Validator{} 

:状況がこのようなものです。 マッチングは自動的にクラス名で行う必要があります。

+0

ありますか? –

+0

うん、彼らは豆として設定されている – awk

答えて

1

これを実行してアプリケーションコンテキストで登録するには、BeanPostProcessorを作成することができます。ポストプロセッサは、適切な命名規則を持つAbstractControllerインスタンスを探し、バリデータ名を生成し、リフレクションによってバリデータオブジェクトをインスタンス化し、コントローラに設定することができます。このような何か:

public Object postProcessAfterInitialization(final Object bean, final String name) throws BeansException { 
    if (bean instanceof AbstractController) { 
     String controllerName = bean.getClass().getSimpleName(); 
     if(controllerName.endsWith("Controller")) { 
      String validatorName = controllerName.replaceFirst("Controller$", "Validator"); 
      try { 
       Class<?> validatorClass = Class.forName(validatorName); 
       Validator validator = (Validator)validatorClass.newInstance(); 
       ((AbstractController)bean).setValidator(validator); 
      } catch(Exception e) { 
       throw new FatalBeanException("Cannot instantiate validator", e); 
      } 
     } 
    } 
    return bean; 
} 

彼らは依存性注入または何を必要とするので、バリがのSpring Beanとして登録されている場合あるいは、あなたがBeanFactoryPostProcessor(ないBeanPostProcessor)を作成することができ、すべてのコントローラのBean定義を見つけますタイプまたは名前でバリデータBeanの定義を照合し、一致するバリデータを各コントローラBeanのプロパティリストに追加します。私はそれのためのサンプルコードを持っていませんが、うまくいけばあなたは考えを得る。

0

は、あなたの設定でこのようなものを使用することができませんでした:バリデータのための豆は

<bean id="abstractControllerTemplate" abstract="true"> 
    <property name="validator" ref="myFormValidator"/> 
</bean> 
... 
<bean id="someOtherConcreteController" class="com.myproj.controllers.SomeOtherConcreteController" parent="abstractControllerTemplate"> 
     <!-- other properties specific to this controller --> 
</bean> 
+0

それは私が自動割り当て – awk