使用HttpMessageConverters处理控制器中的HTML和非HTML表示

时间:2013-06-14 09:48:29

标签: spring rest spring-mvc

我有一个用于RESTful资源(ServiceDirectoryController)的Spring MVC控制器,我想要同时提供HTML(网页)和非HTML(Web服务)表示。我想使用视图名称和JSP来生成HTML表示,但HttpMessageConverter用于其他表示。我该怎么做?

我已经为非HTML表示实现了请求处理方法。我的内部(域模型)表示是ThingNames,我有适当的消息转换器,所以请求处理方法很简单:

 @RequestMapping(value = { "/directory/" }, method = RequestMethod.GET)
 @ResponseBody
 public ThingNames retrieveThings() {
    ...
 }

现在我想为JSP页面添加请求处理方法。所以我需要一个方法来指示视图名称并提供合适的模型。所以,显而易见的是:

 @RequestMapping(value = { "/directory/" }, method = RequestMethod.GET)
 public String retrieveThings(Map< String, Object > model) {
    ...
 }

以视图名称作为返回值。

但那会有用吗? Spring是否足够聪明地确定HTML表示应该由第二种方法处理,并将第一种方法用于所有其他表示?如果没有,如何我将如何处理JSP / HTML和非JSP / HTML表示?

1 个答案:

答案 0 :(得分:1)

根据a Spring blog post by Paul Chapman,如果我设置 PPA内容协商策略,我的控制器将以书面的形式工作。也就是说,如果我按照以下降序排列顺序,请将Spring配置为考虑所需内容类型的线索:

  1. 路径扩展(.htm.tsv等)
  2. 请求参数(?format=htm?format=xls
  3. 接受标头(正确的HTTP内容协商,遗憾的是HTML浏览器效果不佳)。
  4. 更重要的是,Spring提供的ContentNegotiationManagerFactoryBean按此顺序运行。


    此外,您必须在控制器中注释处理程序方法,以便Spring知道这些方法应使用consumes注释的produces@RequestMapping值来处理HTML内容。也就是说,而不是简单地写

     @RequestMapping(value = { "/directory/" }, method = RequestMethod.GET)
     @ResponseBody
     public String retrieveThings(Map< String, Object > model) {
        ...
     }
    

     @RequestMapping(value = { "/directory/" }, method = RequestMethod.GET,
        produces = MediaType.TEXT_HTML_VALUE)
     @ResponseBody
     public String retrieveThings(Map< String, Object > model) {
        ...
     }