2015-06-11 12 views
0

Я получаю следующее исключение при попытке отправить многослойное сообщение:JavaMail ClassCastException при отправке сообщения из нескольких

java.lang.ClassCastException: com.sun.xml.internal.ws.encoding.StringDataContentHandler cannot be cast to javax.activation.DataContentHandler 
at javax.activation.MailcapCommandMap.getDataContentHandler(MailcapCommandMap.java:609) 
at javax.activation.MailcapCommandMap.createDataContentHandler(MailcapCommandMap.java:563) 
at javax.activation.DataHandler.getDataContentHandler(DataHandler.java:625) 
at javax.activation.DataHandler.writeTo(DataHandler.java:329) 
at javax.mail.internet.MimeUtility.getEncoding(MimeUtility.java:268) 
at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1366) 
at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1021) 
at javax.mail.internet.MimeMultipart.updateHeaders(MimeMultipart.java:419) 
at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1345) 
at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1021) 
at javax.mail.internet.MimeMultipart.updateHeaders(MimeMultipart.java:419) 
at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1345) 
at javax.mail.internet.MimeMessage.updateHeaders(MimeMessage.java:2106) 
at javax.mail.internet.MimeMessage.saveChanges(MimeMessage.java:2074) 
at com.ex.notificationservice.email.MailSender.send(MailSender.java:324) 

код для метода MailSender.send:

MimeMessage message = new MimeMessage(session); 

message.setSubject(subject); 

message.setFrom(new InternetAddress(fromAddr)); 

if (toAddrs != null) { 
    for (String toAddr : toAddrs) { 
     if (isEmpty(toAddr) == false) { 
      message.addRecipient(Message.RecipientType.TO, new InternetAddress(toAddr)); 
     } 
    } 
} else { 
    throw new MessagingException("MailSender: Destination address(es) not specified."); 
} 

Multipart multipart = new MimeMultipart("mixed"); 

MimeBodyPart mbp1 = new MimeBodyPart(); 

Multipart alternativeMultipart = new MimeMultipart("alternative"); 

MimeBodyPart textBodyPart = null; 
MimeBodyPart htmlBodyPart = null; 
MimeBodyPart xmlBodyPart = null; 

if (isEmpty(textContent) == false) { 
    textBodyPart = new MimeBodyPart(); 
    textBodyPart.setText(textContent); 

    alternativeMultipart.addBodyPart(textBodyPart); 
} 

if (isEmpty(htmlContent) == false) { 
    htmlBodyPart = new MimeBodyPart(); 
    htmlBodyPart.setContent(htmlContent, "text/html; charset=utf-8"); 

    alternativeMultipart.addBodyPart(htmlBodyPart); 
} 

if (isEmpty(xmlContent) == false) { 
    xmlBodyPart = new MimeBodyPart(); 
    xmlBodyPart.setContent(xmlContent, "text/xml; charset=utf-8"); 

    alternativeMultipart.addBodyPart(xmlBodyPart); 
} 

mbp1.setContent(alternativeMultipart); 

multipart.addBodyPart(mbp1); 

if (files != null) { 
    for (File file : files) { 
     MimeBodyPart mimeBodyPart = new MimeBodyPart(); 

     mimeBodyPart.attachFile(file); 

     multipart.addBodyPart(mimeBodyPart); 
    } 
} 

message.setContent(multipart); 

message.setSentDate(new Date()); 

//Exception occurs here 
message.saveChanges(); 

Transport.send(message); 

Обычно он работает и посылает как ожидается, на некоторое время после появления сервера. Вызов неподходящего веб-сервиса с использованием Jax-WS, похоже, ускоряет эту проблему.

Я понимаю, что это исключение является типичным для проблем с загрузкой классов, хотя у меня нет каких-либо библиотек в моем проекте, содержащих пакеты, показанные в исключении.

Возможно ли, что другой загрузчик классов загружает один из этих классов при запуске или во время выполнения? Я вижу, что JBoss имеет модуль javax.activation.api, но слишком много других модулей зависят от него, чтобы исключить его с помощью jboss-deployment-structure.xml.

Я использую JDK 1.7, JBoss 7.0.2, Java Mail 1.4.4.

ответ

1

Во взаимодействии JavaMail и JAX-WS был bug. В последних версиях JDK есть исправление для этой ошибки. Обновите JDK 1.8 или последнюю версию JDK 1.7.

Обходной может сделать это после того, как JAX-WS инициализируется:

MailcapCommandMap mailMap = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
    mailMap.addMailcap("multipart/mixed;;x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 

Это может привести к JAX-WS, чтобы потерпеть неудачу, если это необходимо для обработки составного сообщения.

+0

спасибо. К сожалению, переход к более новой версии JDK будет долгим процессом. Существуют ли какие-либо известные способы обхода этой ошибки, которые я мог бы реализовать за это время? – tomoyo

+0

Я обновил свой ответ с возможным обходным путем. –

Смежные вопросы