【问题标题】:Spring MVC: How to treat html suffix like any RequestMappingSpring MVC:如何像任何 RequestMapping 一样对待 html 后缀
【发布时间】:2013-04-03 22:59:06
【问题描述】:

我有一个遗留系统和一些我们想要摆脱的 url 重写规则。其中一个要更改的规则是 /tools/lookup.html?what=this 并将其更改为 /tools/search?what=this 并实际上返回 json 而不是 html !

我正在尝试找到一种方法让 @Controller 支持旧格式 lookup.html,但它失败并显示 HTTP 406 “此请求标识的资源只能生成具有不可接受的特征的响应,根据请求“接受”标头。”。我想知道是否有人做过类似的事情?

我的控制器方法如下所示:

@RequestMapping(value = "/tools/lookup.html", method = RequestMethod.GET)
public @ResponseBody Result lookup() {
    return result;
}

提前致谢 西尔万

【问题讨论】:

    标签: spring model-view-controller controller


    【解决方案1】:

    移除reponsebody注解将停止controlle方法返回json。

    【讨论】:

    • 嗨,我实际上想返回 json,我的问题是旧 url 使用 .html 但充当 Rest 服务。是的,您是对的,删除响应正文注释会阻止返回 json。
    【解决方案2】:

    仔细查看@RequestMapping,它支持produces 元素。例如,

    @RequestMapping(value = "/tools/search", produces = "application/json")
    @ResponseBody
    public Result search(...) { ... }
    

    【讨论】:

    • 嗨,威利,感谢您的回答,但运气不好。产生缩小映射但不能解决我的问题(相同的结果)。我需要告诉 Spring 忽略正常的 .html 处理并充当正常的休息方法。如果我用 .toto 替换 .html,它可以工作,但我无法更改我的旧 URL。
    【解决方案3】:

    问题来自于 spring 如何处理路径变量。默认行为将切断 url (.html) 中的最后一个点以查找请求映射。 这种效果只发生在最后一个路径变量上。

    我还没有找到一个属性来全局更改它,但一种方法是告诉您的路径变量映射使用正则表达式 {pathvariable:.+}。

    @Requestmapping("/somepath/{varwithextention:.+}")
        public String method(@Pathvariable String varwithextension) {
        ...
    }
    

    编辑:我看到您甚至不使用路径变量。不过,最后一个 url 部分的效果可能还是一样的吗?

    【讨论】:

    • 嗨马丁,感谢您的建议,如果我返回 void,问题似乎与 ResponseBody 的交互有关,但我真的希望能够使用 ResponseBody
    • 嗨,我追踪到 AbstractMessageConverterMethodProcessor,似乎因为它以 .html 结尾,即使客户端支持 application/json,它也会强制唯一支持的类型为 text/html。我尝试了 setUseSuffixPatternMatch(false) 和 setUseRegisteredSuffixPatternMatch(false) 但阅读文档并不能解决我的问题。
    【解决方案4】:

    嗨,终于找到了适合我的东西,请注意,我的应用不需要支持真正的 html(仅限 REST 应用),所以这应该不会有太大的副作用。在我的 WebMvcConfigurerAdapter 中,我为 html 添加了以下媒体类型。

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.mediaType("html",MediaType.APPLICATION_JSON);
        configurer.mediaType("html",MediaType.APPLICATION_XML);
        super.configureContentNegotiation(configurer);
    }
    

    我现在将我的 JSON 或 XML 内容返回到客户端。不再出现 406 错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-25
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 2011-07-13
      • 1970-01-01
      相关资源
      最近更新 更多