Получение ClassCastException в Java - PullRequest
       10

Получение ClassCastException в Java

1 голос
/ 26 августа 2011

Привет, я получаю следующее исключение

Исключение в потоке "main" java.lang.ClassCastException: javax.mail.util.SharedByteArrayInputStream нельзя преобразовать в javax.mail.Multipart

Я не получаю никаких исключений компиляции в Eclipse IDE, но когда я пытаюсь собрать проект, я получаю это исключение.

После сборки проекта я запускаю проект через java -jar, поэтому он не удовлетворяетусловие if (content instanceof Multipart), но когда я работаю в Eclipse IDE, оно работает нормально.Любые указатели будут очень полезны для меня

Из IDE затмения я получаю megssage.getContent () как javax.mail.internet.MimeMultipart@1dc0e7a, но при запуске с использованием файла jar я получаю содержимоеas javax.mail.util.SharedByteArrayInputStream@2f0d54

Подскажите, пожалуйста, в чем разница между ними.

Модифицированный код:

 InputStream inStream = null;
    if(!message.getContentType().contains("text/plain")){
        Object content = message.getContent();          
        if (message.isMimeType("multipart/*")) {  
            //message.isMimeType("multipart/*")||
            Multipart multipart = (Multipart) content;
            for (int j = 0; j < multipart.getCount(); j++) {
                BodyPart bodyPart = multipart.getBodyPart(j);
                inStream = bodyPart.getInputStream();
                fileName=bodyPart.getFileName();
                } 
        }
        else{
        System.out.println("content not instance of multipart");    
        }`enter code here`  

Пожалуйста, кто угоднопомогите мне в решении этой проблемы ..

Заранее спасибо ...

Ответы [ 5 ]

5 голосов
/ 26 августа 2011

message.getContent() возвращает javax.mail.util.SharedByteArrayInputStream здесь, но SharedByteArrayInputStream не может быть приведен к экземпляру Multipart, поскольку вы не обязательно можете иметь составное сообщение.

Вы можете проверить, является ли его mimetype чем-то составным:

if (message.isMimeType("multipart/*") {
    Multipart mp = (Multipart)message.getContent();
    // more stuff
}

Или вы можете сделать экземпляр ...

if (message.getContent() instanceof Multipart) {
    Multipart mp = (Multipart)message.getContent();
    // more
}
1 голос
/ 26 августа 2011

Хорошо, вот что происходит. Похоже, вы пытаетесь получить контент от объекта, который реализует javax.mail.Part, но формат неизвестен, и в этом случае MimeMessage вернет входной поток . В этом случае он возвращает javax.mail.util.SharedByteArrayInputStream. В любом случае входной поток не может быть преобразован в интерфейс Multipart.

Вы можете проверить, является ли он составным компонентом, используя isMimeType ( предложение Birryree ):

if (message.isMimeType("multipart/*") 
{
    Multipart multipart = (Multipart) content;
    // what you have above.
}
else
{
    // it is not multi-part
}

Или вы можете проверить на прямое соответствие (мое первоначальное предложение):

// other string comparisons will work here too.
if(message.getContentType().equals("multipart"))
{
     Multipart multipart = (Multipart) message.getContent();
    // what you have above.
}
else
{
    // it is not multi-part
}

getContentType также находится на интерфейсе Part. Его документацию можно найти здесь .
Вы можете увидеть список всех возможных типов контента здесь .

Или вы можете протестировать на основе результата instanceof ( ответ Джона Скита ):

Object content = message.getContent();
if (content instanceof Multipart)
{
    Multipart multipart = (Multipart) content;
    // what you have above.
}
else
{
    // it is not multi-part
}
1 голос
/ 26 августа 2011

Для неизвестных mime-типов класс MimeMessage возвращается с ShraedByteArrayInputstream, как говорит документация .

Проверьте тип возврата с помощью instanceof, затем приведите.

Обновление:

Если вы используете тот же источник, что и в Eclipse, а ответ метода getContent() по-прежнему отличается, то вы можете попробовать изменить свойство file.encoding.

Пример:

java -Dfile.encoding=UTF8 -jar something.jar

Update2:

Возможно, более старая версия загруженного класса используется в вашем банке. Пожалуйста, проверьте ваш путь к классам для загруженных классов.

1 голос
/ 26 августа 2011

Вы получаете исключение, потому что возвращаемое значение getContent является ссылкой на javax.mail.util.SharedByteArrayInputStream, и этот класс не реализует Multipart.Предположительно, это не составное почтовое сообщение.

Как указано в документации для Part.getContent:

Возвращает содержимое в виде объекта Java.Тип возвращаемого объекта, конечно, зависит от самого содержимого.Например, объект, возвращаемый для содержимого «text / plain», обычно является объектом String.Объект, возвращаемый для содержимого «multipart», всегда является подклассом Multipart.Для типов контента, которые неизвестны системе DataHandler, входной поток возвращается как контент

Так что, в основном, если вы хотите обрабатывать составные сообщения определенным образом, вам нужно использовать:

Object content = message.getContent();
if (content instanceof Multipart)
{
    Multipart multipart = (Multipart) content;
    // ...
}
else
{
    // Handle non-multipart content
}
0 голосов
/ 27 апреля 2013

Когда вы экспортируете файл jar Runnable, выберите пакет необходимых библиотек в сгенерированный JAR, что решает проблему.

Это может произойти из-за того, что некоторая кодировка не может быть найдена должным образом, поэтому возвращаемый составной объект не анализируется.

...