2010-04-22 3 views

risposta

31

Utilizzando Primavera 3.2 o superiore:

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

Test con un contesto di test 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; 
    } 
} 

E - come chiesto da LppEdd - funziona con le password troppo come sul lato server non c'è differenza tra input [tipo = password] e input [tipo = testo]

+1

Questa è la migliore risposta per Spring 3.2 o successive, sebbene il codice di test distrae dalla sua semplicità. Hai solo bisogno del primo blocco di codice. Il resto del codice non è specifico per la domanda. E invece di metterlo in una classe * ControllerAdvice *, puoi anche metterlo direttamente nella classe controller o nella classe base del controller. – Codo

+0

Funziona anche con Spring Boot 1.3 e Spring MVC 4.2 – fatiherdem

+0

E i passowords? – LppEdd

0

È possibile all'utente una proprietà 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; 
    } 

e impostare i intercettori HandlerMapping

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

Oppure utilizzare un filtro servlet

+1

diffidare di un approccio di questo tipo - un utente può utilizzare uno spazio come primo e/o ultimo carattere della propria password. Anche la tua implementazione sopra non è nulla. – anger

+0

Il codice sopra non viene compilato. – niels

11

Registra questo editor di proprietà: org.springframework.beans.propertyeditors.StringTrimmerEditor

E xample per 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

Non sono sicuro di come siete riusciti a farlo funzionare, ma in Spring Portlet MVC, questo semplicemente non si sposterà. Prima di tutto, StringTrimmerEditor non implementa l'interfaccia di PropertyEditorRegistrar e, anche se lo avesse fatto, non ha alcun costruttore no-arg predefinito.Ho finito per scrivere il mio StringTrimmerEditorRegistrar e l'iniezione in ConfigurableWebBindingInitializer, ma sono curioso di sapere come hanno fatto tutti a farlo funzionare? – quantum

+1

StringTrimmerEditor ha due costruttori, è possibile passare booleano o stringa e booleano, controllare la documentazione –

+2

Se si utilizza Spring 3.2 o versione successiva, è possibile che si desideri esaminare la risposta di Janning. (* AnnotationMethodHandlerAdapter * è ora deprecato.) – Codo

4

È anche possibile utilizzare il servizio di conversione di Spring, che ha il vantaggio aggiuntivo di lavorare con <mvc:annotation-driven/> e con Spring Webflow. Come per le altre risposte, lo svantaggio principale è che questo è un cambiamento globale e non può essere disattivato per alcune forme.

Avrete bisogno di un convertitore per fare il taglio

public class StringTrimmingConverter implements Converter<String, String> { 

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

} 

Poi definire un servizio di conversione che conosce il vostro convertitore.

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

e legarlo in mvc.

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

Se si utilizza Primavera WebFlow allora necessita di un involucro

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

e un'impostazione del costruttore flusso

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