spring boot框架,使用ajax请求,路径含有“.json”,访问失败,不含时访问成功

2019-01-02 21:21发布

问题:

Controller如下
@Controller
@RequestMapping("/portal/youGouGoods")
public class YouGouGoodsController {

@RequestMapping(value = "getTopCategoryList")
@ResponseBody
public Object getTopCategoryList(YouGouGoodsCondition condition) {
try {
return youGouGoodsService.getTopCategoryList(condition);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
}

ajax请求如下:
function initFirstType() {
$.post(ctx+"/portal/youGouGoods/getTopCategoryList.json",{"page":1,"rows":1000}, function(data) {
if (data.length > 0)
$.each(data, function(idx, item) {
var option = $("<option value='" + item.categorySn + "'>" + item.name + "</option>");
$("#firstType").append(option);
});
}, "json");
}

含.json的返回值,这一段没有进入controller

不含.json的返回值

回答1:

经查阅官方文档,发现Spring Boot认为如今的内容协商制度越来越可靠,不需要多写一步".json"来确保传递给客户端的数据格式正确,因此默认禁用后缀模式匹配,意思就是在普通的spring MVC中,/aaa/bbb.json的请求可以匹配到控制器,但是在Spring Boot中,无法匹配控制器。

官网提供的解决方案:
1)直接删掉“.json”
2)如果实在不放心,将/aaa/bbb.json替换为/aaa/bbb?format=json
3)在application.perproties中增加如下配置,就可以继续使用“/aaa/bbb.json”来匹配控制器了
spring.mvc.contentnegotiation.favor-path-extension=true
spring.mvc.pathmatch.use-suffix-pattern=true
4)但第三种操作打开了所有的后缀模式匹配,为了更安全起见,官网还提供了第四种解决方案
spring.mvc.contentnegotiation.favor-path-extension=true
spring.mvc.pathmatch.use-registered-suffix-pattern=true

个人推荐前两种解决方案



回答2:

post 请求给的是地址,你的控制器的路由地址是“/portal/youGouGoods”,方法的路由地址是“getTopCategoryList”,最后访问的路径“/portal/youGouGoods/getTopCategoryList”,,你加个 .json 干啥。。



回答3:

去掉.json,你在ajax把数据类型加上就行



标签: