2010-04-22 6 views

Respuesta

31

utilizando Spring 3.2 o superior:

@ControllerAdvice 
public class ControllerSetup 
{ 
    @InitBinder 
    public void initBinder (WebDataBinder binder) 
    { 
     StringTrimmerEditor stringtrimmer = new StringTrimmerEditor(true); 
     binder.registerCustomEditor(String.class, stringtrimmer); 
    } 
} 

Prueba con un contexto de prueba MVC:

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration 
public class ControllerSetupTest 
{ 
    @Autowired 
    private WebApplicationContext wac; 
    private MockMvc     mockMvc; 

    @Before 
    public void setup () 
    { 
     this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); 
    } 

    @Test 
    public void stringFormatting () throws Exception 
    { 
     MockHttpServletRequestBuilder post = post("/test"); 
     // this should be trimmed, but only start and end of string 
     post.param("test", "  Hallo Welt "); 
     ResultActions result = mockMvc.perform(post); 
     result.andExpect(view().name("Hallo Welt")); 
    } 

    @Configuration 
    @EnableWebMvc 
    static class Config 
    { 
     @Bean 
     TestController testController () 
     { 
      return new TestController(); 
     } 

     @Bean 
     ControllerSetup controllerSetup () 
     { 
      return new ControllerSetup(); 
     } 
    } 
} 

/** 
* we are testing trimming of strings with it. 
* 
* @author janning 
* 
*/ 
@Controller 
class TestController 
{ 
    @RequestMapping("/test") 
    public String test (String test) 
    { 
     return test; 
    } 
} 

y - como se le preguntó por LppEdd - que funciona con contraseñas demasiado como en el lado del servidor no hay diferencia entre la entrada [tipo = contraseña] y la entrada [tipo = texto]

+1

Esta es la mejor respuesta para Spring 3.2 o posterior, aunque el código de prueba distrae de su simplicidad. Solo necesitas el primer bloque de código. El resto del código no es específico de la pregunta. Y en lugar de ponerlo en una clase * ControllerAdvice *, también puede ponerlo en la clase de controlador o en la clase base del controlador directamente. – Codo

+0

También funciona con Spring Boot 1.3 y Spring MVC 4.2 – fatiherdem

+0

¿Qué pasa con los passowords? – LppEdd

0

Puede usuario una propiedad Primavera-MVC Interceptor

public class TrimInterceptor extends HandlerInterceptorAdapter { 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
     Enumeration<String> e = request.getParameterNames(); 
     while(e.hasMoreElements()) { 
      String parameterName = e.nextElement(); 

      request.setParameter(parameterName, request.getParameter(parameterName).trim()); 
     } 

     return true; 
    } 

y configurar su interceptores HandlerMapping

<bean id="interceptorTrim" class="br.com.view.interceptor.TrimInterceptor"/> 
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" p:interceptors-ref="interceptorTrim"/> 
} 

O utilizar un filtro de servlet

+1

Tenga cuidado con un enfoque como este - un usuario puede utilizar un espacio como primer y/o último carácter de su contraseña. Su implementación anterior tampoco es nula segura. – anger

+0

El código anterior no se compila. – niels

11

registro de este editor de la propiedad: org.springframework.beans.propertyeditors.StringTrimmerEditor

E jemplo para AnnotionHandlerAdapter:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    ... 
    <property name="webBindingInitializer"> 
    <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
     <property name="propertyEditorRegistrar"> 
     <bean class="org.springframework.beans.propertyeditors.StringTrimmerEditor" /> 
     </property> 
    </bean> 
    </property> 
    ... 
</bean> 
+2

No estoy seguro de cómo lograron hacerlo funcionar, pero en Spring Portlet MVC, esto simplemente no cambiará. Antes que nada, StringTrimmerEditor no implementa la interfaz PropertyEditorRegistrar e, incluso si lo hizo, no tiene un constructor no-arg por defecto.Terminé escribiendo mi propio StringTrimmerEditorRegistrar e insertando en ConfigurableWebBindingInitializer, pero me resulta curioso saber cómo todos pudieron hacerlo funcionar. – quantum

+1

StringTrimmerEditor tiene dos constructores, puede pasar booleano o cadena y booleano, consulte la documentación –

+2

Si utiliza Spring 3.2 o posterior, es posible que desee consultar la respuesta de Janning. (* AnnotationMethodHandlerAdapter * ahora está en desuso.) – Codo

4

También puede usar el servicio de conversión de Spring, que tiene el beneficio adicional de trabajar con <mvc:annotation-driven/> y con Spring Webflow. Al igual que con las otras respuestas, la principal desventaja es que se trata de un cambio global y no se puede desactivar para ciertas formas.

Usted necesitará un convertidor para hacer el recorte

public class StringTrimmingConverter implements Converter<String, String> { 

    @Override 
    public String convert(String source) { 
     return source.trim(); 
    } 

} 

a continuación, definir un servicio de conversión que se sabe acerca de su convertidor.

<bean id="applicationConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> 
    <property name="converters"> 
    <list> 
     <bean class="mypackage.util.StringTrimmingConverter"/> 
    </list> 
    </property> 
</bean> 

y añada eso a mvc.

<mvc:annotation-driven conversion-service="applicationConversionService"/> 

Si utiliza primavera Webflow entonces se requiere un envoltorio

<bean id="defaultConversionService" class="org.springframework.binding.convert.service.DefaultConversionService"> 
    <constructor-arg ref="applicationConversionService"/> 
</bean> 

y un ajuste en su constructor flujo

<flow:flow-builder-services id="flowBuilderServices" conversion-service="defaultConversionService" development="true" validator="validator" /> 
Cuestiones relacionadas