Java OSGI和其他mail.jar发送纯文本附件,抛出异常:“text/plain”DataContentHandler需要String对象,

Java OSGI和其他mail.jar发送纯文本附件,抛出异常:“text/plain”DataContentHandler需要String对象,,java,osgi,email-attachments,Java,Osgi,Email Attachments,在我的环境中,两个不同的邮件jar存在于两个不同的类加载器中,因为我们的要求是让两个版本的邮件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_pl

在我的环境中,两个不同的邮件jar存在于两个不同的类加载器中,因为我们的要求是让两个版本的邮件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)

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

基本上,它与MailCapCommand MapdefaultCommandMap相关,MailCapCommand MapdefaultCommandMap是JRE中定义的一个系统静态映射,类名是CommandMap.java,两个类加载器都在启用“自动更新SAML令牌”时在EBXML运行时evn中更新了MailCapCommand映射

详细信息是当BC interior server启动时,类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的JAR

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

我的解决方案是,在类SMIMEUtil.init中启动BC Interior Server时,将两个mailcap添加到mailcap命令映射下面

 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内部服务器没有任何危害。但这可能会给带有附件的SBR请求带来一些问题。但幸运的是,我们没有使用此功能,我们只简单地发送HTTP请求以获取SMAL令牌。因此,对于SAML部分也可以

上次我用我的分辨率做了这个文本,它对IS和SAML更新都很有效


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

此问题缺少生成此问题的代码,请在问题的编辑中添加此问题,或者如果您不能添加,请在评论中添加此问题。谢谢,@hoijui,我终于解决了。您是否回答了您自己的问题?是的,最后,我自己解决了。您可以发布解决方案吗?否则此问题将被删除StackOverflow上无用。@NeilBartlett我的解决方案是我的帖子的答案。基本上是在customize classloader将类加载到JVM,然后强制将mailcup加载到Map.CommandMap mimeMap=CommandMap.getDefaultCommandMap;mc.addMailcaptext/plain;;x-java-cont之后ent handler=com.tibco.ax.fw.mime.DefaultTextHandler;mc.addMailCaptText/xml;;x-java-content-handler=com.tibco.ax.fw.mime.DefaultTextHandler;