java.lang.ClassCastException: com.sun.mail.handlers.multipart_mixed не может быть приведен к javax.activation.DataContentHandler. - PullRequest
0 голосов
/ 28 марта 2019

Линия 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, поэтому он должен быть литейным. Почему не так?

1 Ответ

0 голосов
/ 29 марта 2019

Всякий раз, когда подкласс явно не может быть приведен к его законному суперклассу, у вас есть дублирующиеся классы, загруженные разными загрузчиками классов.Найдите, куда вы загружаете классы активации (суперкласса), удалите все, кроме одного (как правило, вам нужно исключить один класс, который приносит ваш собственный проект) и используйте предоставленный класс из фреймворка.

В сообщении об исключении указаны названные классы, но в нем отсутствуют загрузчики классов, участвующие в игре, поэтому сообщение, с первой попытки понять его, не имеет особого смысла.Как только вы узнаете о нескольких загрузчиках классов, например, о нескольких экземплярах javax.activation.DataContentHandler, это станет более логичным.

Редактирование: С помощью операторов compileInclude в вашем build.gradle вы эффективно объединяете все свои зависимостив свой собственный файл JAR.Но у фреймворка есть собственная версия этих классов, и, хотя все они имеют одно и то же имя, теперь они будут разными (не только числовыми) версиями, загруженными через разные загрузчики классов.Вы должны использовать compileInclude только в том случае, если вы явно зависите от чего-то, чего вы никогда не найдете во время выполнения OSGi.Вместо этого используйте compileOnly или compile по умолчанию и разверните дополнительные зависимости во время выполнения вместе с вашим модулем.

Проверьте эту статью для подробного описания того, что вы 'мы сделали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...