2013-06-03 3 views
0

스프링 MVC를 사용하기 위해 레거시 애플리케이션을 리팩토링하고 있습니다. 모든 컨트롤러 (레거시)는 Model 유형의 객체를 반환하고 기존 디스패처는 model.getContent()의 출력을 작성하고 getContent 메소드는 내부 처리를 수행하고 json 문자열을 반환합니다. 수백 개의 컨트롤러가 있고이를 다시 쓰고 싶지 않습니다. 커스텀 뷰 핸들러를 작성하여 Spring 서블릿 config에 포함시킬 수 있습니까?스프링 MVC 커스텀 뷰

샘플 컨트롤러 :

public UserList extends BasicAction { 
    @Autowired 
    UserService userService; 
    @Autowired 
    UserCommand userCommand; 

    @Override 
    public Model getModel(Request req, Response resp) 
      throws ServletException, IOException { 
     Model model = new Model(); 


     List<User> users; 
     try { 
      users = userService.getUsers((UserCriteria)userCommand.getResult()); 
      model.addCollection(users); 
      model.setWrapper(new UserWrapper()); 


     } catch (ValidationException e) { 

      e.printStackTrace(); 
     } catch (WebCommandException e) { 

      e.printStackTrace(); 
     } 



     return model; 
    } 
} 

나는 @Controller로 주석을 계획입니다. @RequestMapping을 지정하거나 xml 구성에서 기본 클래스 BasicAction (기존 mvc)을 제거합니다. 최근에이 프로젝트에 스프링을 도입했고 의존성 삽입 및 요청 스코프 된 명령 객체 (요청 래퍼)를 사용하도록 리팩토링했습니다.

답변

1

가장 직접적인 것은 Model 클래스에 View 인터페이스를 구현하는 것입니다. 그런 다음 레거시 컨트롤러가이 클래스를 직접 반환 할 수 있으며 (현재는 그대로) 메서드를 호출하여 DispatcherServlet에 의해 렌더링됩니다.

또 다른 가능성은 처리기 (mavContainer.setRequestHandled(true);)로 처리기가 실제로 응답을 표시하고 아무런 렌더링도 시도하지 않도록 자신의 HandlerMethodReturnValueHandler을 구현하는 것입니다.

+0

대단히 감사합니다! 아주 간단한 솔루션과 작품! – user979051

0

JSON 응답을 출력하는 사용자 정의 ViewResolver를 만드는 것이 좋다고 생각합니다. 이것은 Spring MVC에서 ViewResolver리스트를 설정하기 위해 설정 될 것이고 우선 순위를 올려 놓을 것이다. 내 생각에 작동하도록되어있는 방식은 Spring MVC가 목록의 맨 위에서 시작하고 반환 유형을 처리하는 SVR을 리턴 할 때까지 각 ViewResolver를 시도하는 것입니다. 사용자 정의 ViewResolvers를 만드는 방법을 Google에 알려야합니다. 한 번 사용한 적이 없기 때문에 ViewResolvers를 만들어야합니다.하지만 인터페이스이기 때문에 가능해야합니다. 나는 이것이 당신의 컨트롤러에 어떤 코드 변경도 요구하지 않을 유일한 방법이라고 믿는다.

그러나 JSON을 수행하는 "선호하는"방법은 클래스 경로에 Jackson을두고 JSON으로 직렬화하려는 객체를 단순히 반환하는 것입니다. Spring은이를 자동으로 JSON으로 변환 할 것이고, 나는 그들이 제공하는 ViewResolver를 사용한다고 믿는다. 하지만 필자는 많은 작업 코드를 리펙토링하지 않으려 고 함과 관련이 있습니다.