Внешняя инициализация @InitBinder в WebBindingInitializer - PullRequest
1 голос
/ 10 августа 2011

Есть два основных способа инициализации привязки данных, но у oldschool есть недостаток, который я не могу понять. Этот способ аннотации великолепен:

@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(","));
}

, но я не могу сделать это с помощью ConfigurableWebBindingInitializer. Прежде всего, экземпляр связующего создается в AnnotationMethodHandlerAdapter, и инициализатор передается экземпляру связующего где-то в HandlerMethodInvoker, поэтому я не могу его настроить ... Я не могу сделать что-то вроде этого:

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

Потому что экземпляр связывателя передается в него в handlerAdapter. Как я могу настроить переплет?

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Нет способа настроить его в конфигурации xml.Вы должны реализовать свой собственный WebBindingInitializer ... Очевидно, что в ConfigurableWebBindingInitializer отсутствует возможность настройки разрешенных и ограниченных полей ...

Или вы можете проголосовать SPR-8601

0 голосов
/ 10 января 2016

Это очень старо, однако для тех, кому не нравится использование аннотаций в производственном коде (например, я), есть решение, которое я нашел, чтобы добавить связыватель инициализации без использования аннотаций.Вам нужно только перезаписать метод initBinder, который выходит из большинства базовых контроллеров, предоставляемых Spring:

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

Где мой класс CurrencyPropertyEditor является подклассом java.beans.PropertyEditorSupport с перезаписанными методами getAsText, getValue, setValue и setAsTextа также.

Надеюсь, это поможет !!!

...