您好我得到以下异常
线程“main”中的异常java.lang.ClassCastException:javax.mail.util.SharedByteArrayInputStream无法强制转换为javax.mail.Multipart
我在Eclipse IDE中没有得到任何编译异常,但是当我尝试构建项目时,我得到了这个异常。
在构建项目之后,我通过java -jar运行项目,因此它不满足if(内容实例的Multipart)条件,但是当我从Eclipse IDE运行时它工作正常。任何指针对我都有很大帮助
从eclipse IDE中我将megssage.getContent()改为javax.mail.internet.MimeMultipart@1dc0e7a 但是当使用jar文件运行时我得到的内容为 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`
请任何人帮助我解决这个问题..
提前致谢...
答案 0 :(得分:5)
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 :(得分:1)
您收到异常,因为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
}
答案 2 :(得分:1)
好的,这就是发生的事情。看起来您正在尝试从实现javax.mail.Part的对象获取内容,但格式未知,在这种情况下MimeMessage will return an input stream。在这种情况下,它返回javax.mail.util.SharedByteArrayInputStream
。无论如何,输入流无法转换为Multipart
接口。
您可以使用isMimeType(birryree's suggestion)测试它是否是多部分的实施者:
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
接口上。其文档可以找到here
您可以看到所有可能内容类型here的列表。
或者您可以根据instanceof(Jon Skeet's answer)的结果进行测试:
Object content = message.getContent();
if (content instanceof Multipart)
{
Multipart multipart = (Multipart) content;
// what you have above.
}
else
{
// it is not multi-part
}
答案 3 :(得分:1)
对于未知的mime类型,MimeMessage类返回ShraedByteArrayInputstream
,documentation表示。
使用instanceof
检查返回类型,然后进行投射。
更新
如果您使用的是与Eclipse中相同的源,并且getContent()
方法的响应仍然不同,那么您可以尝试修改file.encoding
属性。
示例:
java -Dfile.encoding=UTF8 -jar something.jar
UPDATE2:
也许你的jar中使用了旧版本的加载类。请检查您的类路径中是否有已加载的类。
答案 4 :(得分:0)
导出Runnable jar文件时,选择将所需的包打包到生成的JAR中,这样可以解决问题。
这可能是因为无法正确找到某些字符集,因此不会解析返回的多部分对象。