com.sun.mail.handlers.text_plain 不能转换为 javax.activation.DataContentHandler

sto*_*age 2 java coldfusion

我正在从 ColdFusion 8 升级到 ColdFusion 9。我有一个从 CF 调用的 Java 类,它读取和解析 mbox 邮箱文件的内容。该类在 CF 8 中运行良好,但在 CF 9 中引发错误。错误是:

com.sun.mail.handlers.text_plain 不能转换为 javax.activation.DataContentHandler

错误发生在 Java 代码从 javax.mail.internet.MimeMessage 调用 getContent() 函数的地方。根据消息的 MIME 类型,我将 getContent() 的返回值转换为 String、MimeBodyPart 或 Part 之一。

有没有人有任何想法如何解决这个问题?

这是我的 Java 函数:

public String getHtmlContent(Part p) throws IOException, MessagingException {
    StringBuffer szContent = new StringBuffer();
    if ( p.isMimeType("text/plain") ) 
    {
        szContent.append( contentToHtml( (String) p.getContent() ) );           
    }
    else if ( p.isMimeType("multipart/*") ) 
    {
        Multipart multipart = (Multipart) p.getContent();
        for ( int i = 0, n = multipart.getCount(); i < n; i++ ) {
            szContent.append( getHtmlContent((MimeBodyPart) multipart.getBodyPart( i )));               
        }
    }
    else if ( p.isMimeType("message/rfc822") ) 
    {
        szContent.append( getHtmlContent( (Part) p.getContent() ));             
    }
    else 
    {
        throw new RuntimeException( "Cannot determine message content." );
    }
    return szContent.toString();
}
Run Code Online (Sandbox Code Playgroud)

这是 Java 堆栈跟踪:

javax.activation.MailcapCommandMap.getDataContentHandler(MailcapCommandMap.java:581) at javax.activation.MailcapCommandMap.createDataContentHandler(MailcapCommandMap.java:535) at javax.activation.CommandMap.createDataContentHandler(CommandMap.java:191) at javax.activation.DataHandler .getDataContentHandler(DataHandler.java:594) at javax.activation.DataHandler.getContent(DataHandler.java:522) at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:1395) at its.util.MBoxMessage.getHtmlContent( MBoxMessage.java:166) at its.util.MBoxMessage.getHtmlContent(MBoxMessage.java:159) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun .reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在coldfusion.runtime.StructBean.invoke(StructBean.java:502) 在coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:2393) 在cfmessage2ecfm263917690.runPage(\web.shares\web\goat\cf课程\classlist\message.cfm:216) 在coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:231) 在coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:416) 在coldfusion.filter.CfincludeFilter.invoke (CfincludeFilter.java:65) 在coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:363) 在coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40) 在coldfusion.filter.PathFilter.invoke(PathFilter.java: 87) 在coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70) 在coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28) 在coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38) 在coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46) 在coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38) 在coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22) 在coldfusion。 filter.CachingFilter.invoke(CachingFilter.java:53) at Coldfusion.CfmServlet.service(CfmServlet.java:200) at Coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89) at jrun.servlet.FilterChain.doFilter(FilterChain) .java:86) at com.intergral.fusionreactor.filter.FusionReactorFilter.B(Unknown Source) at com.intergral.fusionreactor.filter.FusionReactorFilter.A(Unknown Source) at com.intergral.fusionreactor.filter.FusionReactorFilter.doFilter(未知来源) at jrun.servlet.FilterChain.doFilter(FilterChain.java:94) at Coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42) at Coldfusion。bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46) at jrun.servlet.FilterChain.doFilter(FilterChain.java:94) at jrun.servlet.FilterChain.service(FilterChain.java:101) at jrun.servlet.ServletInvoker.invoke (ServletInvoker.java:106) at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java: 543) 在 jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203) 在 jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) 在 jrunx.scheduler.ThreadPool$ThreadThrottleable(javaThreadPooln) :428) 在 jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266) 在 jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)BootstrapFilter.doFilter(BootstrapFilter.java:46) at jrun.servlet.FilterChain.doFilter(FilterChain.java:94) at jrun.servlet.FilterChain.service(FilterChain.java:101) at jrun.servlet.ServletInvoker.invoke(ServletInvoker) .java:106) at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)在 jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203) 在 jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) 在 jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(JRunProxyService.java:203) ) 在 jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266) 在 jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)BootstrapFilter.doFilter(BootstrapFilter.java:46) at jrun.servlet.FilterChain.doFilter(FilterChain.java:94) at jrun.servlet.FilterChain.service(FilterChain.java:101) at jrun.servlet.ServletInvoker.invoke(ServletInvoker) .java:106) at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)在 jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203) 在 jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) 在 jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(JRunProxyService.java:203) ) 在 jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266) 在 jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)doFilter(BootstrapFilter.java:46) at jrun.servlet.FilterChain.doFilter(FilterChain.java:94) at jrun.servlet.FilterChain.service(FilterChain.java:101) at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java) :106) at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) at jrun .servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203) 在 jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) 在 jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(428)。 jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266) 在 jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)doFilter(BootstrapFilter.java:46) at jrun.servlet.FilterChain.doFilter(FilterChain.java:94) at jrun.servlet.FilterChain.service(FilterChain.java:101) at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java) :106) at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) at jrun .servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203) 在 jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) 在 jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(428)。 jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266) 在 jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)FilterChain.doFilter(FilterChain.java:94) at jrun.servlet.FilterChain.service(FilterChain.java:101) at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106) at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain) .java:42) at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java: 203) at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) at jrunx.scheduler.ThreadPoolin$UpstreamokeMetrics.java: :266) 在 jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)FilterChain.doFilter(FilterChain.java:94) at jrun.servlet.FilterChain.service(FilterChain.java:101) at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106) at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain) .java:42) at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java: 203) at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) at jrunx.scheduler.ThreadPoolin$UpstreamokeMetrics.java: :266) 在 jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)java:101) at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106) at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203) at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) at jrunx .scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266) at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)java:101) at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106) at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203) at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) at jrunx .scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266) at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203) at jrunx.scheduler.ThreadPools$Downstream .invokeRunnable(ThreadPool.java:320) 在 jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) 在 jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266) 在 jrunx.ThreadPools.运行(WorkerThread.java:66)JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203) at jrunx.scheduler.ThreadPools$Downstream .invokeRunnable(ThreadPool.java:320) 在 jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) 在 jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266) 在 jrunx.ThreadPools.运行(WorkerThread.java:66)invokeRunnable(ThreadPool.java:428) at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266) at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)invokeRunnable(ThreadPool.java:428) at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266) at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)

Yon*_*oni 6

这听起来像是一个类加载器问题。有时,像这样的 ClassCastException 是由来自一个类加载器的原始对象类 (com.sun.mail.handlers.text_plain) 和来自另一个类加载器的目标类 (DataContentHandler) 引起的。尽管类是相同的,但 jvm 检测到它们来自不同的类加载器,因此拒绝强制转换。在这种情况下,错误消息的信息量并不大。

这可能是由于 jars 混合而发生的,可能是您的 webapp 文件夹中的一个版本的 JavaMail 和 < jdk_home>/jre/lib/endorsed 中的另一个版本或类似的东西。

  • 我不熟悉 ColdFusion 所以这只是一个猜测,但升级是否也涉及 jdk 升级?
  • 类加载器层次结构中有什么变化吗?也许 webapps 的父级优先与父级最后策略(例如在 Weblogic 和 WebSphere 中支持)?。
  • 你在哪里有 JavaMail 和 Activation jars?你的 webapp 中有那些 jars 吗?