2010-06-04 302 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> 
相關問題