我通过Jodd Mail使用javamail从IMAP收件箱加载电子邮件。该应用程序部署在glassfish中,并且在带有OracleJava7的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"
我试着用OracleJava7在一台32位linux机器上运行相同的代码片段,它运行起来没有问题。
这是javamail/java激活中的一个错误吗?
JavaMail和JAX-WS之间的交互中有一个错误。为了解决这个问题,我们最近对JDK进行了修复。我相信它有最新版本,所以你可能需要在你的CentOS机器上更新JDK。
此外,我认为这个问题是由对图像调用getContent
方法引起的。许多人编写的代码调用getContent
,然后使用返回的Java类型来确定如何处理内容。这是非常低效的,并导致您创建许多永远不需要的Java对象。相反,您应该使用isMimeType
方法根据内容的MIME类型来决定如何处理内容。如果对图像附件所要做的只是将其保存到一个文件中(例如),则永远不需要调用getContent
。这样可以避免遇到您看到的错误。