2010-04-22 27 views

Trả lời

31

Sử dụng mùa xuân 3.2 hoặc cao hơn:

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

thử nghiệm với một bài kiểm tra MVC bối cảnh:

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

Và - như yêu cầu của LppEdd - nó hoạt động với mật khẩu quá như ở phía máy chủ, không có sự khác biệt giữa đầu vào [loại = mật khẩu] và đầu vào [loại = văn bản]

+1

Đây là câu trả lời hay nhất cho Mùa xuân 3.2 trở lên, mặc dù mã thử nghiệm phân tán từ sự đơn giản của nó. Bạn chỉ cần khối mã đầu tiên. Phần còn lại của mã không dành riêng cho câu hỏi. Và thay vì đặt nó vào một lớp * ControllerAdvice *, bạn cũng có thể đặt nó vào lớp điều khiển hoặc lớp cơ sở của bộ điều khiển trực tiếp. – Codo

+0

Đồng thời làm việc với Spring Boot 1.3 và Spring MVC 4.2 – fatiherdem

+0

Còn về passowords thì sao? – LppEdd

0

Bạn có thể sử dụng một mùa xuân-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; 
    } 

Và thiết lập chặn HandlerMapping bạn sở hữu

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

Hoặc sử dụng một Servlet Lọc

+1

Hãy cảnh giác với một cách tiếp cận như thế này - người dùng có thể sử dụng một dấu cách làm ký tự đầu tiên và/hoặc cuối cùng của mật khẩu của họ. Việc triển khai của bạn ở trên cũng không an toàn. – anger

+0

Đoạn mã trên không biên dịch. – niels

11

đăng ký biên tập thuộc tính này: org.springframework.beans.propertyeditors.StringTrimmerEditor

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

Tôi không chắc chắn làm thế nào bạn có tất cả các quản lý để làm cho nó hoạt động, nhưng trong Spring Portlet MVC, điều này chỉ đơn giản là sẽ không nhúc nhích. Trước hết, StringTrimmerEditor không thực hiện giao diện PropertyEditorRegistrar và, ngay cả khi nó đã làm, nó không có hàm tạo no-arg mặc định.Tôi đã kết thúc viết StringTrimmerEditorRegistrar của riêng tôi và tiêm trong ConfigurableWebBindingInitializer, nhưng tôi là curios để biết làm thế nào mọi người quản lý để làm cho nó hoạt động? – quantum

+1

StringTrimmerEditor có hai hàm tạo, bạn có thể chuyển boolean hoặc chuỗi và boolean, kiểm tra tài liệu –

+2

Nếu bạn sử dụng Spring 3.2 hoặc mới hơn, bạn có thể muốn xem câu trả lời của Janning. (* AnnotationMethodHandlerAdapter * hiện không được chấp nhận.) – Codo

4

Bạn cũng có thể sử dụng dịch vụ chuyển đổi của Spring, có thêm lợi ích khi làm việc với <mvc:annotation-driven/> và với Spring Webflow. Như với các câu trả lời khác, nhược điểm chính là đây là một thay đổi toàn cầu và không thể bị vô hiệu hóa cho các hình thức nhất định.

Bạn sẽ cần một bộ chuyển đổi để thực hiện cắt tỉa

public class StringTrimmingConverter implements Converter<String, String> { 

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

} 

Sau đó xác định một dịch vụ chuyển đổi mà biết về chuyển đổi của bạn.

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

và liên kết với mvc.

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

Nếu bạn sử dụng Spring Webflow sau đó nó đòi hỏi một wrapper

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

và một thiết lập về xây dựng dòng chảy của bạn

<flow:flow-builder-services id="flowBuilderServices" conversion-service="defaultConversionService" development="true" validator="validator" /> 
Các vấn đề liên quan