2009-08-12 12 views
22

uso el siguiente editor personalizado en controladores de Primavera-MVC MUCHOS de acuerdo a:¿Cómo puedo registrar un editor personalizado global en Spring-MVC?

Un controlador

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

otro controlador

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

otro controlador

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

Aviso la mismo editor personalizado registrado

Pregunta: ¿cómo puedo configurar un editor global personalizado como este para evitar configurar cada controlador?

cordiales,

Respuesta

13

tiene que declarar en su contexto de aplicación:

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

detalles son here

+0

¿El ¿anula Spring PropertyEditors por defecto? –

+0

Sí. La página a la que he vinculado indica específicamente que (Tabla 5.2. PropertyEditors incorporados) – ChssPly76

+4

La propiedad customEditors está en desuso, y se eliminará en Spring 3 (según javadoc). Debería usar la propiedad PropertyEditorRegistrars en su lugar. – skaffman

12

Si utiliza un controlador basado en anotación (primavera 2.5+), puede utilizar un WebBindingInitializer para registrar editores de propiedades globales. Algo así como

public class GlobalBindingInitializer implements WebBindingInitializer { 

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

} 

Así que en el archivo de contexto de aplicación Web, declarar

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

De esta manera toda controlador basado en anotación puede utilizar cualquier editor de propiedades declaradas en GlobalBindingInitializer.

30

Al iniciar Spring 3.2, puede usar @ControllerAdvice en lugar de usar @ExceptionHandler, @InitBinder y @ModelAttribute en cada Controlador. Se aplicarán a todos los beans @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)); 
    } 
} 

Si había comenzado con Spring Roo Código generado, o limitar las anotaciones escaneados por componentes de escaneo usando include-filtro, a continuación, añadir el filtro requerido en 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> 
Cuestiones relacionadas