记录一下debug日常…
前端网页做了个bootstrap表格,使用的是服务器分页方式,服务器返回的数据需要满足以下JSON格式规范:
{
"total": 20, //总共满足条件的数据数量,bootstrap table会根据这个值和你设置pageSize,自动计算出页码
"rows": [
{
"Id": 1,
"ProductName": "香蕉",
"StockNum": "100"
},
{
"Id": 2,
"ProductName": "苹果",
"StockNum": "200"
},
{
"Id": 3,
"ProductName": "车厘子",
"StockNum": "2010"
}
]
}
我根据自己的情况自定义了一个返回对象:
public class NodeMessListJsonBuild {
private Integer total;
private List<NodeMessList> rows;
......
}
控制器:
@ResponseBody
@RequestMapping(value = "/user/getUpgradeFileLists")
public UpgradeFileListJsonBuild getUpgradeFileLists(QueryTableParms parms, HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
//搜索框功能
//当查询条件中包含中文时,get请求默认会使用ISO-8859-1编码请求参数,在服务端需要对其解码
...中间省略...
UpgradeFileListJsonBuild upgradeFileListJsonBuild=new UpgradeFileListJsonBuild(total,lists);
System.out.println(upgradeFileListJsonBuild);
return upgradeFileListJsonBuild;
}
启动程序后出现的情况:
1.springMVC工程时,以上写法不报错;
2.springBoot工程时,不报错;
3.springBoot工程基础上,我增加了webSocket功能,然后出现异常:
java.lang.IllegalArgumentException: No 'javax.websocket.server.ServerContainer' ServletContext attribute. Are you running in a Servlet container that supports JSR-356?
按照网上的方法,修改了pom.xml文件:
原来的:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
改成:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-tomcatartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-undertowartifactId>
dependency>
然后“java.lang.IllegalArgumentException: No ‘javax.websocket.server.ServerContainer’ ServletContext attribute. Are you running in a Servlet container that supports JSR-356?”问题解决。
但是又报了另一个异常:
No converter for [class java.util.LinkedHashMap] with preset Content-Type 'text/html;charset=UTF-8']
我寻思着没有替换掉tomcat容器的时候都是运行的好好的(为了验证我把pom.xml依赖换回原先的,发现这个错误又没有了,但是我得用websocket只能替换,所以还是得解决这个问题)
根据网上的说法:
1.缺失Jackson 依赖,如果有 spring-boot-starter-web依赖可排除该问题
2.get、set方法需要有
3.注解使用是否正确:需要用@RestController(@Controller+@ResponseBody)
我检查了一下,我都正确使用了,那问题出现在哪里呢?
又查看资料发现:
@ResponseBody注解,表示返回的是字符串,而此时要把@RequestMapping中的produces的值改为application/json才不会报错,如果是text/html则表示跳转到某个页面,前端无法解析为JSON字符串。
根据这个说法,我把控制器注解修改成:
@ResponseBody
@RequestMapping(value = "/user/getUpgradeFileLists",produces = {"application/json;charset=UTF-8"})
public UpgradeFileListJsonBuild getUpgradeFileLists(QueryTableParms parms, HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
//搜索框功能
//当查询条件中包含中文时,get请求默认会使用ISO-8859-1编码请求参数,在服务端需要对其解码
......中间过程省略
UpgradeFileListJsonBuild upgradeFileListJsonBuild=new UpgradeFileListJsonBuild(total,lists);
System.out.println(upgradeFileListJsonBuild);
return upgradeFileListJsonBuild;
}
运行程序发现还是报错。
然后发现我的控制器里写了不该写的语句:
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
把这两句注释掉后,一切正常。。。。。
(也不知道什么原因之前没引入undertow的时候,这两句话没注释也不影响,服啦!)