2010-04-22 5 views
25

Ich weiß, Struts2 Standard-Konfiguration wird alle Zeichenketten aus Formularen trimmen.Kann Feder mvc alle Strings aus Formularen trimmen?

Zum Beispiel:

Ich tippe

" whatever "
in einer Form und einreichen, werde ich bekommen
"whatever"
Der String auto

getrimmt wurde

Ist auch diese Funktion Feder mvc haben? DANKE.

Antwort

31

mit Spring 3.2 oder höher:

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

Testing mit einem MVC-Test-Kontext:

@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; 
    } 
} 

Und - wie von LppEdd gefragt - es funktioniert Passwörter mit zu Wie auf der Serverseite gibt es keinen Unterschied zwischen Eingabe [Typ = Passwort] und Eingabe [Typ = Text]

+1

Dies ist die beste Antwort für Spring 3.2 oder höher, obwohl der Testcode von seiner Einfachheit ablenkt. Sie benötigen nur den ersten Codeblock. Der Rest des Codes ist nicht spezifisch für die Frage. Und anstatt es in eine Klasse * ControllerAdvice * zu setzen, können Sie es auch direkt in die Controller-Klasse oder die Basisklasse des Controllers einfügen. – Codo

+0

Auch mit Spring Boot 1.3 und Spring MVC 4.2 – fatiherdem

+0

Was ist mit Passowords? – LppEdd

0

können Sie Benutzer ein Frühlings-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; 
    } 

Und Ihre HandlerMapping Abfangjäger Eigenschaft

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

oder ein Servlet Filter

+1

wie diese vorsichtig bei einem Ansatz sein - ein Benutzer verwenden kann, ein Leerzeichen als erstes und/oder letztes Zeichen ihres Passwortes. Ihre obige Implementierung ist auch nicht null sicher. – anger

+0

Der obige Code wird nicht kompiliert. – niels

11

Register dieses Eigenschaftseditor verwenden ein: org.springframework.beans.propertyeditors.StringTrimmerEditor

E xample für 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

Ich bin mir nicht sicher, wie es euch allen gelungen ist, es zum Laufen zu bringen, aber in Spring Portlet MVC wird sich das einfach nicht rühren. Zunächst einmal implementiert der StringTrimmerEditor die Schnittstelle PropertyEditorRegistrar nicht, und selbst wenn dies der Fall ist, hat er keinen Standard-Konstruktor no-arg.Ich habe meinen eigenen StringTrimmerEditorRegistrar geschrieben und in ConfigurableWebBindingInitializer injiziert, aber ich bin neugierig zu wissen, wie es allen gelungen ist, es zum Laufen zu bringen. – quantum

+1

StringTrimmerEditor hat zwei Konstruktoren, Sie können Boolean oder String und Boolean übergeben, überprüfen Sie die Dokumentation –

+2

Wenn Sie Spring 3.2 oder höher verwenden, möchten Sie vielleicht auf Janning Antwort zu sehen. (* AnnotationMethodHandlerAdapter * ist jetzt veraltet.) – Codo

4

Sie können auch den Spring-Konvertierungsservice verwenden, der den zusätzlichen Vorteil bietet, mit <mvc:annotation-driven/> und mit Spring Webflow zu arbeiten. Wie bei den anderen Antworten ist der größte Nachteil, dass dies eine globale Veränderung ist und nicht für bestimmte Formen deaktiviert werden kann.

Sie werden einen Konverter benötigen einen Transformations-Dienst zu tun, definieren die Trimm

public class StringTrimmingConverter implements Converter<String, String> { 

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

} 

Dann, die über Ihren Konverter kennt.

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

und binden Sie das in mvc.

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

Wenn Sie Frühling Webflow verwenden dann benötigen sie einen Wrapper

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

und eine Einstellung auf Ihrem Flow Builder

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