Spring MVC:如何像任何RequestMapping一样处理html后缀

时间:2013-04-11 16:26:22

标签: spring model-view-controller controller

我有遗留系统和一些我们想要摆脱的网址重写规则。其中一个是改变的规则是/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;
}

提前致谢 西尔

4 个答案:

答案 0 :(得分:1)

删除响应正文注释将停止控制器方法返回json。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

问题来自于春天如何治疗病态变量。默认行为将切断URL(.html)中的最后一个点以查找请求映射。 此效果仅针对最后一个路径变量发生。

我还没有发现一个属性尚未全局更改,但一种方法是告诉你的pathvariable映射使用正则表达式{pathvariable:。+}。

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

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

编辑:我看到你甚至不使用pathvars。可能它对最后一个url部分的效果仍然相同?

答案 3 :(得分:0)

您好终于找到了适用于我的情况的内容,请注意我的应用不需要支持真正的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错误。