OSGI和不同的mail.jar发送纯文本附件,抛出异常:" text / plain" DataContentHandler需要String对象

时间:2015-08-03 05:13:15

标签: java osgi email-attachments

在我的环境中,两个不同的类加载器中存在两个不同的邮件罐,因为我们的要求是保持两个版本的邮件jar一起工作。

但是在发送纯文本附件时会引发异常:

Caused by: java.io.IOException: "text/plain" DataContentHandler requires String object, was given object of type class [B
    at com.sun.mail.handlers.text_plain.writeTo(text_plain.java:152)
    at javax.activation.ObjectDataContentHandler.writeTo(Unknown Source)
    at javax.activation.DataHandler.writeTo(Unknown Source)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1476)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:865)
    at iaik.smime.SMimeBodyPart.writeTo(Unknown Source)
    at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:462)
    at com.tibco.ax.fw.mime.BCMimeMultipart.writeTo(BCMimeMultipart.java:186)
    at com.tibco.ax.fw.mime.BCMultipartMixed.writeTo(BCMultipartMixed.java:77)
    at javax.activation.ObjectDataContentHandler.writeTo(Unknown Source)
    at javax.activation.DataHandler.writeTo(Unknown Source)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1476)
    at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1772)
    at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1748)
    at com.tibco.ax.ebms3.runtime.outbound.EBMS3OBMimeMessage.encodeMessage(EBMS3OBMimeMessage.java:275)

1 个答案:

答案 0 :(得分:0)

本周我专注于研究这个问题,最后我想通了。这是我的分析和解决方案。

基本上,它与MailCapCommand Map(defaultCommandMap,JRE中定义的系统静态映射,类名为CommandMap.java)以及EBXML运行时evn中的两个ClassLoader更新的MailCapCommand Map相关,当启用“Automaticlly update SAML token”时。

详细信息是BC内部服务器启动时,类SMIMEUtil.init()将加载在文件“com / tibco / ax / fw / ediint / resource / defaultMailcap.properties”中定义的邮件上限,包括

        text/*;;x-java-content-handler=com.tibco.ax.fw.mime.DefaultTextHandler

当SBR加载SBR的jar也将从他们的逻辑加载邮件上限,并且他们添加了两个特殊的邮件上限命令

        text/xml={content-handler=[com.sun.xml.ws.encoding.XmlDataContentHandler]

text / plain = {content-handler = [com.sun.xml.ws.encoding.StringDataContentHandler] //不是来自SBR的罐子

和PP使用附件发送事务,然后mail.jar逻辑将尝试通过contentType从MailCapCommand Map中查找DataContentHandler。例如,QA测试用例是“text / plain”,因此程序将获得com.sun.xml.ws.encoding.StringDataContentHandler来处理内容,但不幸的是,该类是由我们的自定义SBR ClassLoader加载的,在IS ClassLoader中可以找不到这个类,系统将获得系统默认的com.sun.mail.handlers.text_plain来处理内容。但是在com.sun.mail.handlers.text_plain中,我们必须传递一个String对象而不是一个字节数组作为writeTo方法的参数。所以异常“java.io.IOException:'text / plain'DataContentHandler需要String对象,给出类型为[B”的对象被抛出。

在SMIMEUtil.init()类中启动BC Interior Server时,我的解决方案是在两个mailcap下添加到MailCapCommand Map。

 CommandMap mimeMap = CommandMap.getDefaultCommandMap();
    mc.addMailcap("text/plain;;x-java-content-handler=com.tibco.ax.fw.mime.DefaultTextHandler");
     mc.addMailcap("text/xml;;x-java-content-handler=com.tibco.ax.fw.mime.DefaultTextHandler");

因为我们总是在BC程序中将text / plian和text / xml作为文本处理。所以上面的代码对BC Interior Server没有任何伤害。但它可能会带来附件的SBR请求的一些问题。但幸运的是,我们不使用此功能,我们只需简单发送HTTP请求即可获得SMAL令牌。所以它也适用于SAML部分。

最后我用我的分辨率做了文本,它适用于IS和SAML更新。

如果您有任何商品建议,请告知我们。