【问题】
使用dubbo搭建的微服务架构项目中,使用eapUtil把文件上传eap。
报错:Serialized class org.apache.catalina.core.ApplicationPart must implement java.io.Serializable
【分析】
dubbo框架需要序列化,因为在dubbo里只有方法的返回值和参数在进行网络传输。消费者调用方法其实是通过代理类将参数传送到服务提供者那边,然后服务提供执行完方法在将返回值同样传输回来,所以只有参数和返回值在进行网络传输。所以需要实现序列化接口。所以如果方法中的参数和返回值中没有实体类,是不需要实现序列化接口的,当然以防万一提前写上序列化接口是个好习惯,值得一提的是java中很多自带的类都默认实现了序列化接口,比如String就是。
但是MuitipartFile类是不可序列化的,需要转为byte[]进行传递。
【解决方式】
在Controller层将MultipartFile转为byte[]传递给Service层,如果需要MultipartFile携带的参数,也可以在Controller层获取后传给Service层。
【代码】
- Controller层
@ApiOperation("上传文件")
@PostMapping("/fileUpload")
public ResultDTO<EapUploadsResp> fileUpload(@RequsetParam("file") MultipartFile file)throw Exception{
Precondition.checkArgument(null != file , "上传文件不能为空");
//因为dubbo中不能传递MultipartFile,所以需要转为字节后传过去再转回来
byte[] arr=null;
String fileName = file.getOriginalFilename();//获取文件名
long fileSize = file.getSize();//获取图片大小
try {
arr = file.getBytes();
} catch (IOException e) {
e.printStackTrace();
}
return new ResultDTO<>(PublicIndexService.fileUploa(arr,fileName,fileSize));
}
- Service层
在这里插入代码片
【注意点】
- dubbo的配置文件要放在docker文件夹里配置
- 封装工具类时候,要加@Component才能使得@Value读到配置文件的信息
- 如果是静态方法,读取配置文件需要加切面
public class EapUtil{
@Value("${eapConfigPath})
protected String eapConfigPath
private static String eapConfig;
@PostConstruct
public void getEapConfigPath(){
eapConfig = this.eapConfigPath;
}
// 下面调用的时候用 eapConfig
}