java.lang.ClassCastException:com.sun.mail.handlers.multipart_mixed无法强制转换为javax.activation.DataContentHandler

问题描述 投票:0回答:1

线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,所以它应该是可铸造的。为什么不呢?

java exception javamail liferay-7
1个回答
0
投票

每当子类显然不能被类型化为其合法的超类时,您就会有不同的类,由不同的类加载器加载。找到加载激活(超类)类的位置,除去一个以外的所有类(通常你需要消除你自己的项目带来的一个类)并使用框架中提供的类。

Exception消息命名有问题的类,但省略了参与游戏的类加载器,这就是为什么消息在首次尝试理解它时没有多大意义。一旦你了解了多个类加载器,即javax.activation.DataContentHandler的多个实例,它就更有意义了。

编辑:使用build.gradle中的compileInclude语句,您可以有效地将所有依赖项捆绑到自己的jar文件中。但是框架有自己的这些类的版本,虽然它们都有相同的名称,但它们现在将是不同的版本(不仅仅是数字),通过不同的类加载器加载。如果你明显依赖于在OSGi运行时中永远找不到的东西,那么你应该只使用compileInclude。相反,使用compileOnlycompile作为默认值,并将其他依赖项与模块一起部署到运行时。

查看this article,了解您所做的事情的详细说明。

© www.soinside.com 2019 - 2024. All rights reserved.