복붙노트

[SPRING] 주석이 달린 컨트롤러의 동적 명령 클래스

SPRING

주석이 달린 컨트롤러의 동적 명령 클래스

Spring MVC 3에서, AbstractCommandController는 더 이상 사용되지 않으므로 더 이상 setCommandClass ()에서 명령 클래스를 지정할 수 없습니다. 대신 명령 클래스를 요청 핸들러의 매개 변수 목록에 하드 코딩하십시오. 예를 들어,

@RequestMapping(method = RequestMethod.POST)
public void show(HttpServletRequest request, @ModelAttribute("employee") Employee employee)

내 문제는 사용자가 일반 빈을 편집 할 수 있도록 일반 페이지를 개발 중이므로 런타임까지 명령 클래스를 알 수 없기 때문입니다. 변수 beanClass가 AbstractCommandController를 사용하여 명령 클래스를 보유하고 있다면 다음을 수행하면됩니다.

setCommandClass(beanClass)

커맨드 객체를 메서드 매개 변수로 선언 할 수 없기 때문에 요청 처리기 본문의 Spring에 요청 매개 변수를 바인딩하는 방법이 있습니까?

해결법

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

    1.Spring이 명령 클래스를 알아야하는 유일한 곳은 명령 객체의 인스턴스 생성입니다. 그러나이를 @ ModelAttribute-annotated 메서드로 재정의 할 수 있습니다.

    Spring이 명령 클래스를 알아야하는 유일한 곳은 명령 객체의 인스턴스 생성입니다. 그러나이를 @ ModelAttribute-annotated 메서드로 재정의 할 수 있습니다.

    @RequestMapping(method = RequestMethod.POST) 
    public void show(HttpServletRequest request, 
        @ModelAttribute("objectToShow") Object objectToShow) 
    {
        ...
    }
    
    @ModelAttribute("objectToShow")
    public Object createCommandObject() {
        return getCommandClass().newInstance();
    }
    

    그런데 Spring은 실제 generics에서도 잘 작동합니다.

    public abstract class GenericController<T> {
        @RequestMapping("/edit")  
        public ModelAndView edit(@ModelAttribute("t") T t) { ... }
    }
    
    @Controller @RequestMapping("/foo")
    public class FooController extends GenericController<Foo> { ... }
    
  2. from https://stackoverflow.com/questions/3897185/dynamic-command-class-in-annotated-controller by cc-by-sa and MIT license