Может ли пружинный MVC обрезать все строки, полученные из форм? - PullRequest
30 голосов
/ 22 апреля 2010

Я знаю, что стандартная конфигурация struts2 обрезает все строки, полученные из форм.

Например:

Я набираю

"   whatever "
в форме и отправляю, я получу
"whatever"
Строка была автоматически обрезана

Есть ли у Spring mvc эта функция? THX.

Ответы [ 6 ]

38 голосов
/ 18 октября 2012

Использование Spring 3.2 или выше:

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

Тестирование с контекстом теста 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;
    }
}

И - как спрашивает LppEdd - он работает и с паролями, поскольку на стороне сервера нет разницы между входом [type = password] и входом [type = text]

11 голосов
/ 04 июля 2011

зарегистрировать этот редактор свойств: * *org.springframework.beans.propertyeditors.StringTrimmerEditor 1004

Пример для 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>
4 голосов
/ 16 февраля 2013

Вы также можете использовать сервис преобразования Spring, который имеет дополнительное преимущество работы с <mvc:annotation-driven/> и Spring Webflow.Как и в случае с другими ответами, основным недостатком является то, что это глобальное изменение, и его нельзя отключить для определенных форм.

Для обрезки вам понадобится конвертер

public class StringTrimmingConverter implements Converter<String, String> {

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

}

Затем определите сервис конвертации, который знает о вашем конвертере.

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

и привяжите его к mvc.

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

Если вы используете Spring Webflow, тогда ему требуется оболочка

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

и настройка вашего построителя потока

<flow:flow-builder-services id="flowBuilderServices" conversion-service="defaultConversionService" development="true"  validator="validator" />
2 голосов
/ 23 апреля 2010

Вы можете использовать Spring-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;
    }

И настройте свойство перехватчиков HandlerMapping

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

Или используйте фильтр сервлетов

1 голос
/ 28 июня 2018

Просто настроил приведенный выше код, чтобы приспособиться к Spring Boot, если вы хотите явно обрезать функцию для некоторых полей в форме, вы можете показать их как показано ниже:

@Component
@ControllerAdvice
public class ControllerSetup {
    @InitBinder({"dto", "newUser"})
        public void initBinder(WebDataBinder binder) {
          binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
          binder.registerCustomEditor(String.class, "userDto.username", new StringTrimmerEditor(false));
          binder.registerCustomEditor(String.class, "userDto.password", new DefaultStringEditor(false));
          binder.registerCustomEditor(String.class, "passwordConfirm", new DefaultStringEditor(false));
        }
}
0 голосов
/ 12 июня 2019

первый , обрезать запрос paraparam, который является строкой , вы можете создать класс и ограничения WebBingdingInitializer

 @ControllerAdvice
public class CustomWebBindingInitializer implements WebBindingInitializer {

    @InitBinder
    @Override
    public void initBinder(WebDataBinder webDataBinder, WebRequest webRequest) {
        webDataBinder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
    }
}

Пожалуйста, используйте componentScan, чтобы этот класс был Spring Bean.

Но я не знаю, как обрезать значение String в данных JSON requestBody.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...