Существует ли способ аннотации для регистрации PropertyEditors глобально в Spring MVC 3.0? - PullRequest
6 голосов
/ 10 марта 2011

Мне было интересно, есть ли способ зарегистрировать PropertyEditor глобально в Spring MVC 3.0 и далее. В документации в их документации они показывают, как использовать аннотации для настройки PropertyEditor компонента для каждого контроллера, и - кажется, это похоже на XML-способ сделать это глобально. Поэтому мне было интересно, есть ли способ, используя только аннотации, чтобы зарегистрировать PropertyEditors для всех контроллеров, не делая метод @InitBinder для каждого из них. Создание общего суперкласса с помощью метода @InitBinder также нежелательно.

Другой вопрос был задан до выпуска Spring 3.0.

1 Ответ

5 голосов
/ 20 января 2013
package com.projectr.web;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.beans.propertyeditors.CustomBooleanEditor;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.beans.propertyeditors.CustomNumberEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.support.WebBindingInitializer;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.multipart.support.ByteArrayMultipartFileEditor;

/**
 * Shared WebBindingInitializer for custom property editors.
 * 
 * @author aramirez
 * 
 */
public class CommonBindingInitializer implements WebBindingInitializer {
    public void initBinder(WebDataBinder binder, WebRequest request) {
        binder.registerCustomEditor(Integer.class, null, new CustomNumberEditor(Integer.class, null, true));
        binder.registerCustomEditor(Long.class, null, new CustomNumberEditor( Long.class, null, true));
        binder.registerCustomEditor(Boolean.class, null, new CustomBooleanEditor(true));
        binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());
        SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy", request.getLocale());
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, null, new CustomDateEditor(dateFormat, true));
    }
}

В вашем приложении-контексте или диспетчер-сервлете

  <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="webBindingInitializer">
      <bean class="com.projectr.web.CommonBindingInitializer"/>
    </property>
  </bean>

Аннотация эквивалент кода выше.Обратите внимание, что @ControllerAdvice введен в Spring 3.2.x

@ControllerAdvice
public class CommonBindingInitializer {
  @InitBinder
  public void registerCustomEditors(WebDataBinder binder, WebRequest request) {
    binder.registerCustomEditor(Integer.class, null, new CustomNumberEditor(Integer.class, null, true));
    binder.registerCustomEditor(Long.class, null, new CustomNumberEditor( Long.class, null, true));
    binder.registerCustomEditor(Boolean.class, null, new CustomBooleanEditor(true));
    binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());
    SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy", request.getLocale());
    dateFormat.setLenient(false);
    binder.registerCustomEditor(Date.class, null, new CustomDateEditor(dateFormat, true));
  }
}
...