2009-07-30 5 views
1

Ich benutze Feder MVC und möchte Standard-Validator für Javascript zu verwenden. Ich habe eine Reihe von Controllern, die eine gemeinsame abstrakte Klasse und eine Reihe von Validatoren erweitern, die eine gemeinsame Schnittstelle implementieren. Die Situation ist so etwas wie dieses:Automatische dynamische Bindung im Frühjahr

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{} 

Ich möchte automatisch den Validator Feld respectivelly für jeden konkreten Regler einstellen (so dass FooController.validator Instanz FooValidator wäre). Die Zuordnung sollte automatisch durch Klassennamen erfolgen.

+0

Gibt es Bohnen für die Validierer? –

+0

yep, sie sind als Beans konfiguriert – awk

Antwort

1

Sie könnten dazu einen BeanPostProcessor erstellen und ihn im Anwendungskontext registrieren. Der Postprozessor könnte nach AbstractController Instanzen mit der richtigen Namenskonvention suchen, den Validierungsnamen generieren, das Validator-Objekt über eine Reflektion instanziieren und es in den Controller setzen. Etwas wie folgt aus:

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; 
} 

Alternativ kann, wenn die Validierer als Spring-Beans registriert sind, weil sie Dependency Injection oder was auch immer benötigen, könnten Sie eine BeanFactoryPostProcessor (kein BeanPostProcessor) erstellen, die die Steuerung aller Definitionen Bohne findet Nach Typ oder Name suchen Sie dann nach passenden Validierungs-Bean-Definitionen nach Typ oder Name und fügen den passenden Validator zur Eigenschaftsliste jeder Controller-Bean hinzu. Ich habe keinen Beispielcode dafür, aber hoffentlich bekommst du die Idee.

0

Könnten Sie nicht so etwas wie dies in Ihrer Konfiguration verwenden:

<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

Das ist nicht, was ich mit der automatischen Zuweisung gemeint habe – awk