今天新写了个方法报了这个奇怪的错。后台正常查到数据,但是前端拿不到。
之前有过这个错误,但是由于时间的原因没有细究,改了dao.xml文件的一个属性就正常了。具体可看那次经历
https://blog.csdn.net/yao8513277/article/details/81034511
今天又遇见这个问题,觉得不能这么简单的放过去了,于是就决定搞定它。
通过报错名称就能知道哪里错了
web容器生成的servlet代码中有out.write(""),response.getOutputStream()产生冲突.即Servlet规范说明,
不能既调用response.getOutputStream(),又调用response.getWriter(),无论先调用哪一个,在调用第二个时候应会抛出IllegalStateException。
在调用第一个之后,调用第二个之前,添加
out.clear();
out = pageContext.pushBody();
但是我这不是jsp啊,原生的html文件,哪来的代码。。。想来想去只能是Thymeleaf模板里面或者其他地方有内置的流操作,没法直接操作了。那么就只能从返回结果上入手了。
之前用的是springmvc 的@ResposeBody标签直接干,简单省事,现在需要换一种方式了,这里我使用了HttpServletResponse 返回结果,详情看下面代码。
@RequestMapping("/machineList")
public void machineList(HttpServletResponse response, AdvertisementMachine advertisementMachine, ModelMap modelMap){
User user=(User)modelMap.get("loginUser");
int userID = user.getId();
advertisementMachine.setUserID(userID);
List<AdvertisementMachine> machineGroupList = machineService.findAllMachine(advertisementMachine);
String jsonResult = JSON.toJSONString(machineGroupList);
renderData(response, jsonResult);
}
private void renderData(HttpServletResponse response, String data) {
PrintWriter printWriter = null;
try {
printWriter = response.getWriter();
printWriter.print(data);
} catch (IOException ex) {
Logger.getLogger(MachineGroupController.class.getName()).log(Level.SEVERE, null, ex);
} finally {
if (null != printWriter) {
printWriter.flush();
printWriter.close();
}
}
}
至此前端可以拿到数据了
$.ajax({
url:url,
dataType:"json",
type:"post",
success:function (data,status) {
console.log(data)
},error:function () {
console.log(456)
}
});
收工~