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的返回值
经查阅官方文档,发现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
个人推荐前两种解决方案
post 请求给的是地址,你的控制器的路由地址是“/portal/youGouGoods”,方法的路由地址是“getTopCategoryList”,最后访问的路径“/portal/youGouGoods/getTopCategoryList”,,你加个 .json 干啥。。
我也不知道,单位的项目就加了“.json",我也很是郁闷,原来的MVC框架下是没有问题的,换成了spring boot框架就出问题了
@瑾年绝恋醉流苏: 估计是你们原来的架构上面,方法的路由地址是 “getTopCategoryList.json” 这样,或者在其他地方给他拼上的,不然地址应该不肯能随意多加东西的
@面具灬: Spring MVC有一个叫“后缀模式匹配”的东东,“.json”是后缀,有没有后缀,都可以匹配到正确的路由
去掉.json,你在ajax把数据类型加上就行
为什么要加
– dudu 6年前.json
扩展名?@dudu: 加.json是确保传递给客户端的数据类型是JSON类型
– 瑾年绝恋醉流苏 5年前