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

cut 发布于 2019-03-09 controller 最后更新 2019-03-09 14:38 0 浏览

我有一个遗留系统和一些我们想要摆脱的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;
}
提前致谢 西尔
已邀请:

daut

赞同来自:

问题来自于春天如何处理路径变量。默认行为将切断URL(.html)中的最后一个点以查找请求映射。 此效果仅针对最后一个路径变量发生。 我还没有发现一个属性尚未全局更改,但一种方法是告诉你的pathvariable映射使用正则表达式{pathvariable:。+}。

@Requestmapping("/somepath/{varwithextention:.+}")
    public String method(@Pathvariable String varwithextension) {
    ...
}
编辑:我看到你甚至没有使用pathvars。可能它对最后一个url部分的效果仍然相同?

jvitae

赞同来自:

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

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

hvelit

赞同来自:

嗨终于发现了一些应该适合我的情况,注意我的应用程序不需要支持真正的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错误。

aet

赞同来自:

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