복붙노트

[SPRING] Spring MVC 사용자 정의 메소드 매개 변수 바인딩

SPRING

Spring MVC 사용자 정의 메소드 매개 변수 바인딩

기본 스프링 MVC 매개 변수 바인딩을 사용자 정의하는 방법을 찾고있다. 이 방법을 예로 들어 보겠습니다.

@RequestMapping(value="/index.html")
public ModelAndView doIndex(@RequestParam String param) {
  ...

요청에서 추출하려는 String이있을 때 이것은 쉽습니다. 그러나, 나는 더 완벽한 객체를 채우기를 원한다. 그래서 나의 메소드는 다음과 같다 :

@RequestMapping(value="/index.html")
public ModelAndView doIndex(Foo bar) {
  ...

내가 찾고있는 것은 이와 같은 바인딩을 선언하는 방법입니다.

@RequestMapping(value="/index.html")
public ModelAndView doIndex(@FooPopulator Foo bar) {
  ...

그리고 이것을하는 다른 종류의 구현 자 (@FooPopulator 어노테이션으로 결정됨)가 있습니다 :

public void doBind(Foo target, ServletRequest originalRequest) {
  target.setX(this.computeStuffBasedOn(originalRequest));
  target.sety(y);
}

지금까지 @InitBinderbinder 주석에 대해 알았지 만,이 장면에 대한 올바른 선택인지 여부는 확실하지 않습니다.

가장 좋은 방법은 뭔가요?

해결법

  1. ==============================

    1.많이 쉽다. PropertyEditors와 같은 방식으로 작동하지만 상태가없는 변환기를 사용할 수 있습니다.

    많이 쉽다. PropertyEditors와 같은 방식으로 작동하지만 상태가없는 변환기를 사용할 수 있습니다.

    5.5 장 스프링 3 타입 변환 (Spring reference).

    이러한 컨버터가 한 번 등록 된 경우 추가 정보가 필요하지 않습니다.

    @RequestMapping(value="/index.html")
    public ModelAndView doIndex(@RequestParam Foo param) {
    

    예를 들어 id로 객체를로드하는 간단한 변환기는 다음과 같습니다.

    @Component
    @CustomConverter //custom qualifyer
    public class BUdToUserConverter implements Converter<String, User> {
    
        @Resource
        private UserDao userDao;
    
        @Override
        public User convert(String source) {
            Integer id = Integer.parse(source);
            return this.userDao.getByBusinessId(id);
        }
    }
    

    모든 빈을 @CustomConverter 주석으로 등록하는 "도우미"

    public class ApplicationConversionServiceFactoryBean extends FormattingConversionServiceFactoryBean {
    
        @Resource
        @CustomConverter
        private List<Converter<?, ?>> customConverter;
    
         @Override
        protected void installFormatters(final FormatterRegistry registry) {
            super.installFormatters(registry);
    
            for (Converter<?, ?> converter : customConverter) {
                registry.addConverter(converter);
            }
        }
    }
    

    이것을 어떻게 사용 하는가

    UserController {
    ...
        @RequestMapping(value = "/{id}", method = RequestMethod.GET)
        public ModelAndView show(@PathVariable("id") User user) {        
            return new ModelAndView("users/show", "user", user);
        }
    }
    
  2. ==============================

    2.문제에 대한 "올바른"해결책을 찾았습니다. Spring은 이미이 시나리오를 위해 WebArgumentResolver를 제공합니다.

    문제에 대한 "올바른"해결책을 찾았습니다. Spring은 이미이 시나리오를 위해 WebArgumentResolver를 제공합니다.

    http://sergialmar.wordpress.com/2011/03/29/extending-handler-method-argument-resolution-in-spring-mvc/

    http://scottfrederick.blogspot.com/2011/03/customizing-spring-3-mvcannotation.html

  3. from https://stackoverflow.com/questions/6519322/spring-mvc-customized-method-parameter-binding by cc-by-sa and MIT license