Não consigo recuperar uma imagem da pasta WEB-INF usando classLoader.getResourceAsStream ()

O meio-dia eu estava tentando fazer o meu aplicativo enviar tanto imagens + html via javamail, eu só consegui enviar html, mas com a imagem estou tendo um pouco de problemas. Eu decidi criar uma mensagem multipart, e tudo estava indo bem, mas depois eu uso o carregador de class para recuperar o arquivo .png do WEB-INF / resources / images eu recebo um NullPointerExcetion, eu não sei porque é isso?

Aqui está como meu EJB (3.0) se parece. Eu aprecio uma mão neste eu não tenho muita experiência com a class ClassLoader (não sei muito sobre isso).

@Stateless(name = "ejbs/EmailServiceEJB") public class EmailServiceEJB implements IEmailServiceEJB { @Resource(name = "mail/myMailSession") private Session mailSession; public void sendAccountActivationLinkToBuyer(String destinationEmail, String name) { // Destination of the email String to = destinationEmail; String from = "dontreply2thismessage@gmail.com"; try { Message message = new MimeMessage(mailSession); // From: is our service message.setFrom(new InternetAddress(from)); // To: destination given message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); message.setSubject("Uspijesna registracija"); // How to found at http://www.rgagnon.com/javadetails/java-0321.html message.setContent(generateActivationLinkTemplate(), "text/html"); Date timeStamp = new Date(); message.setSentDate(timeStamp); // Prepare a multipart HTML Multipart multipart = new MimeMultipart(); // Prepare the HTML BodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent(generateActivationLinkTemplate(), "text/html"); multipart.addBodyPart(htmlPart); // PREPARE THE IMAGE BodyPart imgPart = new MimeBodyPart(); String fileName = "/WEB-INF/resources/images/logoemailtemplate.png"; ClassLoader classLoader = Thread.currentThread() .getContextClassLoader(); if (classLoader == null) { classLoader = this.getClass().getClassLoader(); if (classLoader == null) { System.out.println("IT IS NULL AGAIN!!!!"); } } DataSource ds = new URLDataSource(classLoader.getResource(fileName)); imgPart.setDataHandler(new DataHandler(ds)); imgPart.setHeader("Content-ID", "the-img-1"); multipart.addBodyPart(imgPart); // Set the message content! message.setContent(multipart); Transport.send(message); } catch (MessagingException e) { throw new RuntimeException(e); } } 

Eu gostaria de mencionar que estou usando o JEE6 com glassfishV3, eu não sei se minha abordagem é compatível com este servidor de aplicativos.


Atualizar Quando modifico o código acima para

 String fileName = "logoemailtemplate.png"; 

Eu recebo um email, funciona.

Mas agora não recebo o texto. 🙂 Existe algum erro?

Eu acho que você está confundindo ClassLoader#getResourceAsStream() com ServletContext#getResourceAsStream() . O primeiro só carrega resources do caminho de class, enquanto o posterior apenas carrega resources do webcontent (onde também está sua pasta /WEB-INF ).

Você precisa colocar esses resources no caminho de class. Se você estiver usando um IDE, a maneira mais direta é simplesmente soltá-los em qualquer pacote na pasta de origem Java. Ele terminará em /WEB-INF/classs após build, que faz parte do classpath.

Vamos supor que você tenha um pacote com.example.resources.images e você tenha deixado o arquivo logoemailtemplate.png lá, então você pode carregá-lo com o seguinte fileName .

 String fileName = "/com/example/resources/images/logoemailtemplate.png"; 

Uma alternativa é adicionar a pasta /WEB-INF/resources ao caminho de class. Em um IDE como o Eclipse, você pode fazer isso adicionando-o como pasta Origem no caminho de construção do projeto. Então você pode carregá-lo pelo seguinte fileName .

 String fileName = "/images/logoemailtemplate.png"; 

Esta não é, contudo, a prática comum.

Tanto quanto eu sei o classLoader só pode acessar WEB-INF / classs e WEB-INF / lib, mas não WEB-INF / resources. Tente colocar o arquivo na subpasta de classs.

Você deve usar ServletContext.getResourceAsStream () para carregar um arquivo de uma guerra. ClassLoader.getResourceAsStream carrega uma class do caminho de class.