java - java.lang.ClassCastException:com.sun.mail.handlers.multipart_mixed 无法转换为 javax.activation.DataContentHandler
问题描述
该行part.writeTo(out);
抛出java.lang.ClassCastException
:
com.sun.mail.handlers.multipart_mixed 不能转换为 javax.activation.DataContentHandler
private static void getBodyAsRFC822(
MimePart part, boolean ignoreHeaders, ByteArrayOutputStreamout) {
try {
out.reset();
if (ignoreHeaders) {
OutputStream os = MimeUtility.encode(out, part.getEncoding());
part.getDataHandler().writeTo(os);
os.close();
} else {
part.writeTo(out);
out.close();
}
}
catch (Exception e) {
_log.error(e);
}
}
这是我的 build.gradle
compileOnly group: 'com.liferay', name: 'com.liferay.portal.instance.lifecycle', version: '2.0.0'
compileOnly group: "com.liferay.portal", name: "com.liferay.portal.kernel", version: "2.46.0"
compileOnly group: "org.osgi", name: "org.osgi.core", version: "6.0.0"
compileOnly group: "org.osgi", name: "org.osgi.service.component.annotations", version: "1.3.0"
compileInclude group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
compileInclude group: 'org.apache.mina', name: 'mina-core', version: '2.0.16'
compileInclude group: 'javax.mail', name: 'mail', version: '1.4'
compileInclude group: "javax.servlet", name: "servlet-api", version: "2.5"
但是multipart_mixed implements DataContentHandler
,所以它应该是可铸造的。为什么不是?
解决方案
每当一个子类显然不能被类型转换为它的合法超类时,你就会有重复的类,由不同的类加载器加载。找到您加载激活(超类)类的位置,消除除一个以外的所有类(通常您需要消除您自己的项目带来的一个类)并使用框架中提供的类。
Exception 消息命名了有问题的类,但忽略了参与游戏的类加载器,这就是为什么该消息在第一次尝试理解它时没有多大意义。一旦您了解多个类加载器,即 的多个实例javax.activation.DataContentHandler
,它就更有意义了。
编辑:使用compileInclude
build.gradle 中的语句,您可以有效地将所有依赖项捆绑到您自己的 jar 文件中。但是框架有自己的这些类的版本,虽然它们都具有相同的名称,但它们现在将是不同的版本(不仅仅是数字),通过不同的类加载器加载。仅compileInclude
当您明显依赖于在 OSGi 运行时中永远找不到的东西时才应该使用。相反,使用compileOnly
orcompile
作为默认值,并将附加依赖项与您的模块一起部署到运行时。
查看这篇文章,了解您所做工作的详细说明。
推荐阅读
- javascript - 生成随机 id 名称
- html - 如何在 HTML 标签标签中指示一个类
- angular - 纱线工作区和角度“找不到'node_modules'目录。”
- android - 将 minSdkVersion 从 16 更新到 19 后,找不到 com.android.library 错误?
- typescript - 覆盖 Express.js 和 Passport 用户类型 (TypeScript)
- c++ - 如何获得方程C++的总和
- flutter - 如何将 Future 函数中的数据传递给有状态类?
- java - 根据 SOLID 主体注册侦听器
- javascript - 在这种情况下使用 .map 是否正确?
- python - 从 json 读取 str、bool 的元组列表到一个类中