我正在使用javamail通过Jodd Mail从IMAP收件箱加载电子邮件。该应用程序部署在glassfish中,并且在使用Oracle Java 7的Windows中运行没有问题。
使用Oracle Java 7在CentOS 64位机器的glassfish中运行会出现问题。加载图像附件时会抛出异常:
java.lang.IllegalArgumentException: failed to parse:
at java.awt.datatransfer.DataFlavor.<init>(DataFlavor.java:368)
at javax.activation.ActivationDataFlavor.<init>(ActivationDataFlavor.java:81)
at com.sun.xml.internal.ws.encoding.ImageDataContentHandler.<init>(ImageDataContentHandler.java:57)
at sun.reflect.GeneratedConstructorAccessor3931.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at java.lang.Class.newInstance(Class.java:379)
at javax.activation.MailcapCommandMap.getDataContentHandler(MailcapCommandMap.java:588)
at javax.activation.MailcapCommandMap.createDataContentHandler(MailcapCommandMap.java:542)
at javax.activation.CommandMap.createDataContentHandler(CommandMap.java:221)
at javax.activation.DataHandler.getDataContentHandler(DataHandler.java:614)
at javax.activation.DataHandler.getContent(DataHandler.java:542)
at javax.mail.internet.MimeBodyPart.getContent(MimeBodyPart.java:657)
at jodd.mail.ReceivedEmail.processPart(ReceivedEmail.java:89)
at jodd.mail.ReceivedEmail.processPart(ReceivedEmail.java:124)
at jodd.mail.ReceivedEmail.parseMessage(ReceivedEmail.java:82)
附件包含以下标题:
Content-Type: image/png;
name="image1.png"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="image1.png"
我尝试在带有Oracle Java 7的32位Linux机器上运行相同的代码片段,它运行没有问题。
这是javamail / java激活中的错误吗?
答案 0 :(得分:2)
JavaMail和JAX-WS之间的交互存在一个错误。我们最近在JDK中修复了一个问题来解决这个问题。我相信它已在最新版本中提供,因此您可能需要在CentOS计算机上更新JDK。
此外,我认为此问题是由在图像上调用getContent
方法引起的。许多人编写调用getContent
的代码,然后使用返回的Java类型来确定如何处理内容。这是非常低效的,并且使您创建许多您从未需要的Java对象。相反,您应该使用isMimeType
方法根据其MIME类型决定如何处理内容。如果您要对图像附件进行的操作将其保存到文件中(例如),则无需致电getContent
。这样可以避免遇到你所看到的错误。