2

我有一个遗留系统和一些我们想要摆脱的 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;
}

提前感谢西尔万

4

4 回答 4

1

删除 reponsebody 注释将停止返回 json 的 controlle 方法。

于 2013-04-11T16:30:08.543 回答
0

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

@RequestMapping(value = "/tools/search", produces = "application/json")
@ResponseBody
public Result search(...) { ... }
于 2013-04-11T16:39:49.177 回答
0

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

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

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

编辑:我看到你甚至不使用路径变量。不过,对于最后一个 url 部分,它可能仍然具有相同的效果吗?

于 2013-04-12T05:06:49.747 回答
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 错误。

于 2013-04-12T21:37:26.317 回答