1.对象字段缺失
把对象转json进行打印时,发现字段缺失,但是数据的日志打印正常显示字段。
log.info("直接打印整个对象...[{}]", JSONObject.toJSONString(acsDevice));
数据库查出的字段包含server_Url
但是直接打印的对象里却没有
最后发现是mybatis的配置文件问题。mybatis默认是属性名和数据库字段名意义对应的,即数据的字段和实体类的属性都应该是server_url。但是我这里数据库字段是server_url,属性是serverUrl,采用的是驼峰命名,所以要设置属性开启驼峰命名,配置如下:
map-underscore-to-camel-case: true
2.http返回自定义的状态码
自己写的接口定义返回的状态码,如果异常或者其他问题直接返回400。
/**
* 类描述:测试接口
*
* @ClassName TestController
* @Author ward
* @Date 2022-10-12 15:16
*/
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping("/error")
@ResponseBody
public String testError(HttpServletResponse httpServletResponse, String id) {
String result = id + "已上线";
httpServletResponse.setStatus(400);
return result;
}
}
这里可以看到可以随意自定义
3.xml文件的特殊字符
今天写了几个sql发现在数据库软件里可以用>=和<=,写在mapper里会报错,后来发现原来有特殊的转义,总结如下。
[&]——&
[<]——<
[>]——>
["]——"
[']——'
原符号 | 转义符号 |
---|---|
& | &; |
< | <; |
> | >; |
>= | >;= |
<= | <;= |
’ | &apos; |
" | "; |
4.springboot启动报错
启动有时可以有时报错,发现好像是依赖冲突,同时引入了spring-boot-starter和spring-boot-starter-web,其实这里只需要引入spring-boot-starter-web包含了spring-boot-starter。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
5.接口传输中文乱码
开发两个项目接口对接时,A项目的接口被B项目调用时,B项目获得到的中文数据乱码,经过排查发现跟http请求的Content-Type字段有关。
http请求过程中包含Accept请求头部(Request Header),Content-Type实体头部(Response Header),我这里采用的是hutool的http,所以在客户端增加.header(“Accept”,“text/plain;charset=UTF-8”)解决中文乱码问题,核心还是charset=UTF-8。
这里我直接打印了hutool的头部信息:
{Accept=[text/html,application/json,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8],
User-Agent=[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/75.0.3770.142 Safari/537.36 Hutool], Accept-Encoding=[gzip, deflate],
Accept-Language=[zh-CN,zh;q=0.8]}
个人理解:Accept用于客户端,Content-Type用于服务端,中文乱码设置下字符集即可
result = HttpRequest.get(httpUrl)
.timeout(3000)
.header(Header.AUTHORIZATION, "Bearer " + token)
.header("Accept","text/plain;charset=UTF-8")
.execute()
.body();
6.临时路径丢失
springboot在生产环境中,文件上传如果没有配置目录就会产生临时目录,在centos7中可以通过/usr/lib/tmpfiles.d/tmp.conf这个文件来查看清除的时间,默认10d就是10天。为了解决这个问题,在application参数配置里面要指定路径。
vim /usr/lib/tmpfiles.d/tmp.conf
spring:
profiles: produce
servlet:
multipart:
max-request-size: 100MB
max-file-size: 100MB
location: /u01/tomcat/file/
7.request.getParameterMap返回的数据格式问题
根据java规范,这个方法返回的值是数据类型,即Map<String,String[]>,导致我们最后获取到的数据的键值对中的值会是这样,“[123]”,再提取的时候十分麻烦。所以找了个map转换类来进行转换。
/**
* map转换类(<String,String[]>转<String,String>)
*/
public Map<String, String> convertMap(HttpServletRequest request) {
Map<String, String> returnMap = new HashMap<>();
// 转换为Entry
Set<Map.Entry<String, String[]>> entries = request.getParameterMap().entrySet();
// 遍历
for (Map.Entry<String, String[]> entry : entries) {
String key = entry.getKey();
StringBuffer value = new StringBuffer("");
String[] val = entry.getValue();
if (null != val && val.length > 0) {
for (String v:val) {
value.append(v);
}
}
returnMap.put(key, value.toString());
}
return returnMap;
}
8.jsonArray转对象
在做接口对接经常出现套娃,对象里面包含jsonArray,这里要注意细心,一一对应。自己创建的对象只能比待转化的多,不能少。发现包了两层直接diyData = diyModel.getData就不好使了,后续有空再来研究。
//byte转String
String msg = new String(message.getPayload(), StandardCharsets.UTF_8);
DiyModel diyModel = JSONObject.parseObject(msg, DiyModel.class);