2009-08-12 3 views
22

Я использую следующий пользовательский редактор МНОГИХ контроллеров Spring-MVC в соответствии с:Как зарегистрировать глобальный настраиваемый редактор в Spring-MVC?

Контроллер

binder.registerCustomEditor(BigDecimal.class, new CustomNumberEditor(BigDecimal.class, NumberFormat.getNumberInstance(new Locale("pt", "BR"), true)); 

Другой контроллер

binder.registerCustomEditor(BigDecimal.class, new CustomNumberEditor(BigDecimal.class, NumberFormat.getNumberInstance(new Locale("pt", "BR"), true)); 

Другой контроллер

binder.registerCustomEditor(BigDecimal.class, new CustomNumberEditor(BigDecimal.class, NumberFormat.getNumberInstance(new Locale("pt", "BR"), true)); 

Обратите внимание на тот же пользовательский редактор зарегистрирован

Вопрос: как я могу создать глобальный настраиваемый редактор, подобный этому, чтобы избежать настройки каждого контроллера?

С уважением,

ответ

13

Вы должны объявить его в контексте приложения:

<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer"> 
    <property name="customEditors"><map> 
    <entry key="java.math.BigDecimal"> 
     <bean class="org.springframework.beans.propertyeditors.CustomNumberEditor"> 
     ... <!-- specify constructor-args here --> 
     </bean> 
    </entry> 
    </map></property> 
</bean> 

Подробности here

+0

ли он переопределяет стандартные свойства Spring PropertyEditors? –

+0

Да. Страница, связанная с выше, специально указывает, что (Таблица 5.2. Встроенные PropertyEditors) – ChssPly76

+4

Свойство customEditors устарело и будет удалено весной 3 (согласно javadoc). Вместо этого вы должны использовать свойство PropertyEditorRegistrars. – skaffman

12

Если вы используете аннотацию на основе контроллера (Spring 2.5+), вы можете использовать WebBindingInitializer для регистрации глобальных редакторов свойств. Что-то вроде

public class GlobalBindingInitializer implements WebBindingInitializer { 

    public void initBinder(WebDataBinder binder, WebRequest request) { 
     binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), true)); 
    } 

} 

Так что в вашем контексте файла веб-приложений, объявить

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean class="GlobalBindingInitializer"/> 
    </property> 
</bean> 

Таким образом, все аннотации на основе контроллера может использовать любой редактор свойств объявлен в GlobalBindingInitializer.

30

Начиная с весны 3.2, вы можете использовать @ControllerAdvice вместо использования @ExceptionHandler, @InitBinder и @ModelAttribute в каждом контроллере. Они будут применяться ко всем компонентам @Controller.

import org.springframework.web.bind.WebDataBinder; 
import org.springframework.web.bind.annotation.ControllerAdvice; 
import org.springframework.web.bind.annotation.InitBinder; 
import org.springframework.web.context.request.WebRequest; 

@ControllerAdvice 
public class GlobalBindingInitializer { 
    @InitBinder 
    public void registerCustomEditors(WebDataBinder binder, WebRequest request) { 
    binder.registerCustomEditor(BigDecimal.class, new CustomNumberEditor(BigDecimal.class, NumberFormat.getNumberInstance(new Locale("pt", "BR"), true)); 
    } 
} 

Если вы начали с Spring Roo сгенерированного кода, или ограничить аннотации отсканированных компонента сканирование с использованием включать фильтр, затем добавьте требуемый фильтр в webmvc-config.xml

<!-- The controllers are autodetected POJOs labeled with the @Controller annotation. --> 
<context:component-scan base-package="com.sensei.encore.maininterface" use-default-filters="false"> 
    <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/> 
    <!-- ADD THE BELOW LINE --> 
    <context:include-filter expression="org.springframework.web.bind.annotation.ControllerAdvice" type="annotation"/> 
</context:component-scan> 
Смежные вопросы