2009-07-30 7 views
1

J'utilise spring MVC et j'aimerais exposer le validateur par défaut pour javascript à utiliser. J'ai un tas de contrôleurs qui étendent une classe abstraite commune et un groupe de validateurs implémentant une interface commune. La situation est quelque chose comme ceci:Liaison dynamique automatique au printemps

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

Je voudrais mettre automatiquement le champ validateur pour chaque contrôleur béton respectivelly (de sorte que FooController.validator serait par exemple de FooValidator). La correspondance doit être effectuée automatiquement par les noms de classe.

+0

Y at-il des haricots pour les validateurs? –

+0

oui, ils sont configurés comme des haricots – awk

Répondre

1

Pour cela, vous pouvez créer un BeanPostProcessor et l'enregistrer dans le contexte de l'application. Le post-processeur peut rechercher AbstractController instances avec la convention de dénomination appropriée, générer le nom du validateur, instancier l'objet validateur par réflexion et le définir dans le contrôleur. Quelque chose comme ceci:

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

Par ailleurs, si les valideurs sont enregistrés comme les haricots printemps parce qu'ils ont besoin l'injection de dépendance ou autre chose, vous pouvez créer un BeanFactoryPostProcessor (pas BeanPostProcessor) qui trouve toutes les définitions de haricot contrôleur par type ou nom, puis recherche les définitions correspondantes du bean du validateur par type ou nom et ajoute le validateur correspondant à la liste de propriétés de chaque bean contrôleur. Je n'ai pas de code pour ça, mais j'espère que vous avez l'idée.

0

ne pourriez-vous utiliser quelque chose comme ceci dans votre configuration:

<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

Ce n'est pas ce que je voulais dire par l'assignation automatique – awk

Questions connexes