项目中遇到的错误及解决方案三

16 阅读2分钟

一、表单上传复杂对象列表问题

1、对于简单对象的列表上传,后端java可直接使用简单对象的列表或者数据接收,例如:string,int等对象。

2、对于复杂对象的列表上传,后端java应使用包装类接收,即将List或者数组集合,通过对象再包装一层,使用包装后的对象作为参数,否则可能会出现如下错误:

 1、No primary or single unique constructor found for class...

 2、No primary or single unique constructor found for interface java.util.List

二、EasyExcel导出map结构对象方法

简介:关键对象EasyExcel;自定义读取接口ReadListener。EasyExcel已不再维护,可使用fastexcel,网址:readmex.com/fast-excel/… 其完全兼容easyexcel,可快速切换。

当easyExcel导出的集合对象是List<Map<String,Object>>集合对象时,直接使用该集合无法导出数据,需要将其转成List<List>集合对象才能正确导出数据。为保证列和数据是一致的,在转成 List对象时,需要使用对象头去获取数据,转成List对象

原因如下:ExcelWriteAddExcutor.doAddBasicTypeToExcel中的方法导致的,如下图所示:

image.png

三、不同场景,返回不同字段的场景

通过JsonView注解控制不同场景返回不同的字段,但过滤视图会消耗性能,高并发下需判断是否使用。 使用实例如下:

构建通用视图:划分要合理,不要太精细或者太粗,根据实际灵活调整
public class EntityViews {
// 公共基础视图
public interface Public{}

// 摘要视图
public interface Summary extends Public{}

// 详细视图
public interface Detail extends Summary{}

// 管理员视图
public interface Admin extends Detail{}
}

实体类中添加jsonView注解,添加到类上,没有添加jsonView注解的字段,默认继承类注解上的范围
@JsonView(EntityViews.Public.class)
public class Stu {

// 学生ID
@JsonView(EntityViews.Public.class)
private Long stuId;

// 学生姓名
@JsonView(EntityViews.Summary.class)
private String stuName;
}
controller层,通过jsonView注解指定视图范围

四、在异步线程或线程池中中抛出自定义异常

在异步线程中抛出自定义异常无法被全局异常处理器捕获,需要单独处理。
以CompletableFuture为例,因所有异常会被包装成CompletionException异常,所以异常需要在
exceptionally异常方法中单独处理,或者单独处理获取到自定义异常,然后再次抛出或者在全局异常处理 
器中捕获CompletionException异常才能达到预想的效果

五、Feign调用接口时报以下错误:

1、Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed between tokens

这个错误通常与开启了Feign压缩功能有关,解决方案如下: 1、关闭压缩功能

 feign:
  compression:
    request:
      enabled: false # 关闭请求压缩
    response:
      enabled: false # 关闭响应压缩

2、更换底层客户端,如使用okhttp客户端

 feign:
  okhttp:
    enabled: true # 启用 OkHttp
  compression:
    request:
      enabled: true
    response:
      enabled: true