Spring + JavaMail + Images (caminhos relativo)

4 respostas
I

Dae Pessoal,

Estou tentando implementar um serviço de notificação por email com Quartz. Na parte do email, estou me baseando neste exemplo 22.3.1.2. Inline resources. Quando uso os endereços absolutos das imagens como no exemplo tudo funciona perfeitamente. O problema ocorre quando eu tento usar o caminho relativo das imagens. Aqui está uma parte da implementação:

private void sendStatusReport(final ReportPack reportPack) {

    final MimeMessagePreparator preparator = new MimeMessagePreparator() {

	public void prepare(MimeMessage mimeMessage) throws Exception {

		final MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
		//...
		final String text = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine,
				"mail-templates/statusReport.html", getModel(reportPack));

		messageHelper.setText(text, true);
		loadImages(messageHelper);
	}

	private void loadImages(MimeMessageHelper messageHelper) throws MessagingException, URISyntaxException, FileNotFoundException {
		messageHelper.addInline("table_header_left",
				ResourceUtils.getFile("file:/resources/image/table_header_left.png"));
		messageHelper.addInline("table_header_right",
				ResourceUtils.getFile("file:/resources/image/table_header_right.png"));
		messageHelper.addInline("icon_search",
				ResourceUtils.getFile("file:/resources/image/icon_search.png"));
	}
    };
this.mailSender.send(preparator);
}

Aqui o trecho da exceção:

Failed message 1: javax.mail.MessagingException: IOException while sending message;
  nested exception is:
	java.io.FileNotFoundException: \resources\image\table_header_left.png (The system can not find the file path)
	at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:422)
	at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:342)
	at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:357)
	at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:346)
	at br.com.suntech.img.web.email.Mailer.sendStatusReport(Mailer.java:127)
	at br.com.suntech.img.web.email.Mailer.executeInternal(Mailer.java:69)
	at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86)
	at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
	... 1 more

O problema ocorre no momento da tentativa de envio do email. Eu tentei carregar as imagens assim também:

1. ResourceUtils.getFile("classpath:resources/image/table_header_left.png"));
2. ResourceUtils.getFile("classpath*:resources/image/table_header_left.png"));
3. ResourceUtils.getFile("/resources/image/table_header_left.png"));

Todas falharam. A estrutura da aplicação está da seguinte forma:

- app_ear.ear
     - ...
     - app_web.war
         - ...
         - resources
              - ...
              - image
                  - ...
                  - table_header_left.png
                  - table_header_right.png
                  - icon_search.png

Estou fazendo o deploy no Glassfish 2.1. Alguma luz aqui??

Valeu,
Iktuz

4 Respostas

Scoobydoo
java.io.FileNotFoundException: \resources\image\table_header_left.png (The system can not find the file path)

Tem certeza que sua imagem está nessa pasta ???

I

Scoobydoo:
java.io.FileNotFoundException: \resources\image\table_header_left.png (The system can not find the file path)

Tem certeza que sua imagem está nessa pasta ???

Olá Scooby, valeu pela rápida resposta!

Estão sim. Estas imagens estão dentro de um .war que está dentro de um .ear Estas imagens que são usadas no email são inclusive usadas pela parte web, se as mesmas não estivessem empacotadas, teria visto na tela.

Para complementar, inclusive se vou ao c: e crio as pastas resources/images com as benditas imagens lá dentro, funciona perfeitamente. Mas isto me cria um outro problema que é sempre lembrar de replicar esta estrutura no raiz do SO :wink:

Valeu!
Iktuz

Scoobydoo

Entendo…
Então, há uma possibilidade de o IO não estar reconhecendo a tua imagem;
Tipo…
Essa exceção será lançada pela FileInputStream, FileOutputStream e construtores RandomAccessFile quando um arquivo com o caminho especificado não existe.
Também será lançada por esses construtores se o arquivo existe, mas por algum motivo, estiver inacessível, por exemplo, quando é feita uma tentativa para abrir um ficheiro só de leitura para a escrita.

I

Então, se eu pego o seguinte código e mando imprimir onde ele acha que está o aquivo:

//...
System.out.println(">>>> " + ResourceUtils.getFile("resources/image/table_header_left.png").getAbsolutePath());
//...

Olha o que ele imprime:

>>>> C:\Arquivos de programas\glassfish\domains\domain1\config\resources\image\table_header_left.png

Sendo que os arquivos não estão lá e sim em:

C:\Arquivos de programas\glassfish\domains\domain1\autodeploy\app_ear.ear\app_web.war\resources\image\

Valeu, T+

Criado 26 de fevereiro de 2010
Ultima resposta 26 de fev. de 2010
Respostas 4
Participantes 2