1.dto vo都涉及到时区转换的问题
一开始的想法是通过
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
在线程之间进行上下文传递。 发现在dto中获取时区信息(资料图)
String timeZone = (String) BaneksRequestContext.getAttribute("timeZone");
在主线程中是没问题的;但是在子线程中 当请求完成(
SCOPE_REQUEST
)后,AbstractRequestAttributes将执行requestCompleted()
方法,导致requestActive
属性更改为false
;随后在子线程中再去使 用上下文
requestAttributes.getAttribute(name, RequestAttributes.SCOPE_REQUEST)
例如mybatis判断
<if test="xxxDto.startTime != null and xxto.startTime != ''">
调用get方法,就会报错
Cannot ask for request attribute - request is not active anymore!
,因为此时scope为SCOPE_REQUEST
且requestActive
属为false
。解决方案 :
将子线程dto vo涉及到时区转化(需要用到上下文的),手动set赋值(放在一个属性中去存储或者其他地方如redis),不用
getAttribute()
方法。
问题2:存入redis序列化和发序列化的问题
1.字符串格式 -> json 读取
2.二进制格式 ->使用文件相关的redisTemplate
问题3:HttpMessageNotWritableException 转换出错
1.HttpServletResponse 会在请求结束后自动返回,文件格式的返回头是`application/octet-stream;charset=UTF-8` ,若是用ResponseResul封装或者Object作为返回值都会报错(使用了`@ResponseBody`,由`HttpMessageConverter`处理): `No converter for [class com.panda.bankman.model.common.ResponseResult] with preset Content-Type 'application/octet-stream;charset=UTF-8'`
2.解决:使用HttpServletRespons手动构造返回体