谁在 Spring4 Rest Controller 中执行 ViewResolver 的工作? &谁在请求后呈现视图?

Who do the job of ViewResolver in Spring4 Rest Controller? & who render views after request?

简单控制器和 Tiles View Resolver => 有效

/**
 * For Exple:
 * Spring Controller
 * & Tiles View Resolver
 * It Works Well
 */
@Controller
public class Home {
  @Autowired
  private IManager<BaseObject> manager;
  public void setManager(IManager<BaseObject> manager) {
      this.manager = manager;
  } 
  @RequestMapping(value = "/listprovider", method = RequestMethod.GET)
  public String listProvider(ModelMap model) {
      model.addAttribute("listprovider",this.manager.getAllProvider());
      return "listProviderPage";
      // listProviderPage ==> the name of the rendered (Tiles)View.
      // it works well
  }
}

但是使用 RestController 渲染只是 JSON 而不是视图页面,我想同时渲染视图页面和 JSON 数据。

/**
 * But with
 * Spring4 RestController
 * 
 */
@RestController
public class Home {
  @Autowired
  private IManager<BaseObject> manager;
  public void setManager(IManager<BaseObject> manager) {
      this.manager = manager;
  } 
  @RequestMapping(value = "/listprovider", method = RequestMethod.GET)
  public String listProvider() {
      return this.manager.getAllProvider(); // Message Converter To Json
      // what about the view?
      // what is the secret of view resolver in **Spring Rest**
  }
}

@RestController 是@Controller 和@ResponseBody 的组合。

当您使用 @RestController 时,响应会隐式转换为 Json 格式,无需显式声明 @ResponseBody。

它被定义为仅发送定义格式的数据,并且无法使用它检索任何视图。

如果你想从@restcontroller 获取页面,你需要使用 ModelandView 或 编写一个新的控制器并使用@Controller 和return 视图名称进行注释,这样它将查找视图解析器并呈现适当的页面。

您需要在 spring 配置文件

中像下面这样配置视图解析器
@Bean
    public UrlBasedViewResolver urlBasedViewResolver()
    {
        UrlBasedViewResolver res = new InternalResourceViewResolver();
        res.setViewClass(JstlView.class);
        res.setPrefix("/WEB-INF/");
        res.setSuffix(".jsp");
        return res;
    }

因此,当您 return 来自控制器的页面名称时,视图解析器会在 WEB-INF 文件夹和 return 视图中寻找合适的 jsp 页面。

以下link供参考

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/ViewResolver.html