2011-08-10 2 views
1

Il existe deux méthodes principales d'initialisation de la liaison de données, mais il existe un inconvénient dans la méthode oldschool, que je ne trouve pas. Cette manière d'annoter est grande:Externalisation de l'initialisation de @InitBinder dans WebBindingInitializer

@InitBinder("order") 
public void initBinder(WebDataBinder binder) { 
    // Problem is that I want to set allowed and restricted fields - can be done here 
    binder.setAllowedFields(allowedFields.split(",")); 
} 

mais je ne peux pas en avoir terminé avec ConfigurableWebBindingInitializer. Tout d'abord, l'instance de liant est créé dans AnnotationMethodHandlerAdapter et initialiseur est passé à l'instance de liant quelque part dans HandlerMethodInvoker donc je ne peux pas le mettre en place ... Je ne peux pas faire quelque chose comme ceci:

<bean id="codesResolver" class="org.springframework.validation.DefaultMessageCodesResolver" /> 
<bean id="binder" class="org.springframework.web.portlet.bind.PortletRequestDataBinder" scope="prototype"> 
    <property name="allowedFields" value="${allowedFields}" /> 
    <aop:scoped-proxy /> 
</bean> 
<bean id="webBindingInitializer" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
    <property name="messageCodesResolver" ref="codesResolver" /> 
</bean> 

Comme exemple liant est passé dedans dans handlerAdapter. Comment puis-je configurer le classeur alors?

Répondre

2

Il n'y a aucun moyen de le configurer en configuration XML. Vous devez implémenter votre WebBindingInitializer sur mesure ... Le ConfigurableWebBindingInitializer manque évidemment la possibilité de mettre en place des champs autorisés et restreints ...

Ou vous pouvez voter jusqu'à SPR-8601

0

Ceci est très vieux, mais pour tous ceux qui aiment pas l'utilisation d'annotations dans le code de production (comme moi) est une solution que j'ai trouvé pour ajouter un classeur init sans utiliser d'annotations. Il vous suffit de remplacer la méthode initBinder qui va de la plupart des contrôleurs de base fournis par Spring:

protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception 
{ 
    System.out.println("Binding!!!!!"); 
    super.initBinder(request, binder); 
    binder.registerCustomEditor(Double.class, new CurrencyPropertyEditor()); 
} 

Où ma classe CurrencyPropertyEditor est une sous-classe de java.beans.PropertyEditorSupport avec getAsText, getValue, setValue et méthodes de setAsText et écrasent les .

Espérons que ça aide !!!

Questions connexes