2010-06-04 301 views
1

我从ColdFusion 8升级到ColdFusion 9.我有一个Java类,我从CF调用它读取和分析的内容mbox邮箱文件。类正常工作与CF 8,但它抛出一个错误,在CF 9的错误是:com.sun.mail.handlers.text_plain不能转换为javax.activation.DataContentHandler

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(); 
} 

而这里的Java堆栈跟踪:在javax.activation.MailcapCommandMap.createDataContentHandler

javax.activation.MailcapCommandMap.getDataContentHandler(MailcapCommandMap.java:581) (MailcapCommandMap.java:535) at javax.activation.CommandMap.createDataContentHandler(CommandMap.java:191) at javax.activation.DataHandler.getDataContentHandler(DataHandler.java:594) at javax.activation.DataHandl er.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) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl .java:25) at coldfusion.runtime.CfJspPage._invoke(CfJspPage())在Coldfusion.runtime.StructBean.invoke(StructBean.java:502) 处的ColdFusion.runtime.CfJspPage._invoke(Method.java:597) .java:2393) at cfmessage2ecfm263917690.runPage(\ web.shares \ web \ goat \ cf \ courses \ classlist \ message.cfm:216) at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:231) at 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) at 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) 在coldfusion.CfmServlet.service(CfmServlet.java:200) 在coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89) 在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(Unknown Source) at jrun.servlet.FilterChain.doFilter(FilterChain.java:94) at coldfusion.monitor.event.MonitoringServletFilter.doFilter( MonitoringServletFilter.java:42) 在coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46) 在jrun.servlet.FilterChain.doFilter(FilterChain.java:94) 在jrun.servlet.FilterChain.service(FilterChain。的java:101) 在jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106) 在jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) 在jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java: 286) at jrun.servlet.ServletEngi neService.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(ThreadPool.java:428) 在jrunx.scheduler.ThreadPool $ UpstreamMetrics.invokeRunnable(ThreadPool.java:266) 在jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)

回答

0

我从CF的lib文件夹中删除了activation.jar文件。 javax.activation类重复在jrun.jar中,并且这两个JAR文件都位于CF的类路径中。看起来类似于activation.jar中的新类,但是删除它们却为定制类做了一些技巧。希望CF中没有任何东西依赖于新的类。

+0

@stomcavage - 他们实际上存在于几个罐子(jdk的rt.jar等)。无论如何,至少有一些版本。我总是非常不愿意删除CF使用的罐子,而不知道它会带来什么影响。 – Leigh 2010-06-06 03:31:29

4

这听起来像是一个类加载器问题。有时像这样的ClassCastException产生于来自一个类加载器的原始对象类(com.sun.mail.handlers.text_plain)和来自另一个类的目标类(DataContentHandler)。尽管类是相同的,但jvm会检测到它们来自不同的类加载器,因此拒绝投射。在这种情况下的错误信息不是非常丰富。

这可能是由于jar被混淆了,可能是你的webapp文件夹中有一个JavaMail版本,另一个版本是jdk_home>/jre/lib/endorsed或者类似的东西。

  • 我不熟悉ColdFusion,所以这只是一个猜测,但是升级是否也涉及jdk升级?
  • 类装入器层次结构中的任何内容是否更改?也许一个父母的第一个对父亲最后的webapps策略(如Weblogic和WebSphere中支持)?
  • 你在哪里拥有JavaMail和Activation jars?你的webapp中有这些罐子吗?
+0

+1。从我所知道的情况来看,他们改变了邮件罐装入CF9的方式。在CF8中,它们由CF的“App Server类加载器”加载。这是从CF代码创建Java对象时使用的相同的加载器,例如createObject(“java”,..)。但在CF9中,我相信邮件罐是由CF的“bootstrap”类加载器加载的。所以这将解释铸造错误。但我不知道如何解决这个问题.. – Leigh 2010-06-04 21:28:43

0

如果是Maven项目,请尝试搜索邮件库并尽可能排除错误的jar。

我也有Geronimo邮件库的类加载器问题;当我在pom.xml中排除那个罐子时,它已经解决了。

<exclusions> 
<exclusion> 
    <artifactId>geronimo-javamail_1.4_spec</artifactId> 
    <groupId>org.apache.geronimo.specs</groupId> 
</exclusion> 
</exclusions> 
相关问题