Fiz uma loooonga pesquisa no google (conseqüentemente no guj e no resto do universo tbm) pra isso e não me ficou muito claro o que irei lhes perguntar.
Pois bem, tenho um sistema rodando aqui e em alguns momentos ele gera relatórios com o jasper (montados no iReport) e ou os envia por e-mail no formato pdf ou abrem novas abas no navegador exibindo-o em html.
Acontece que esse relatório possue algumas imagens (na verdade uma só, mas whatever) que estão com os paths setados a um diretório incluido no projeto.
O problema é quando eu vou rodar essa aplicação em outro servidor, o path da imagem que adicionei ao relatório corresponde a minha home e lá ele não o reconhece mais.
Adicionei um ImageServlet pra criar o relatório, que resolveu o problema dos espaços em branco (todo espaço em branco no jasperreport é uma imagem em branco) mas ainda assim não resolveu o meu problema das imagens que eu criei.
Alguém tem alguma sugestão de como resolver isso?!
Li em um lugar que poderia passar a imagem como um stream por parâmetro, na criação do relatório, como configuro isso na imagem no iReport?
Muito obrigado pela ajuda pessoal, isso está me comendo um tempo danado!
Olá Tchello.
Bem, acredito que o que está acontecendo é que você tenha informado no iReport o caminho completo da imagem, algo como C:\Tomcat\webapps\suaaplicacao\imgens\img.img. O problema dessa solução é que o caminho do tomcat no servidor pode estar diferente. E esse é apenas um dos problema que pode acontecer.
Para solucionar o problema (se for esse), informe o caminho da aplicação por parametro, por exemplo:
Farei uns testes aqui.
No caso uso Ubuntu, NetBeans 6.5 e JBoss 4.2.2
O projeto se divide em duas partes, a visualização web (projeto web) e a parte de negocios, um projeto diferente.
No projeto web consigo usar o “getRealPath” mas na aplicação não.
Alguma sugestão de como consigo pegar o “realpath” na aplicação “comum”, já que não disponho do “request.getSession().getServletContext().getRealPath(”/imagens");" ?
Grato pela ajuda, creio que isso resolverá boa parte dos meus problemas.
Farei uns testes aqui.
No caso uso Ubuntu, NetBeans 6.5 e JBoss 4.2.2
O projeto se divide em duas partes, a visualização web (projeto web) e a parte de negocios, um projeto diferente.
No projeto web consigo usar o “getRealPath” mas na aplicação não.
Alguma sugestão de como consigo pegar o “realpath” na aplicação “comum”, já que não disponho do “request.getSession().getServletContext().getRealPath(”/imagens");" ?
Grato pela ajuda, creio que isso resolverá boa parte dos meus problemas.
Abraços![/quote]
Já passei por um problema semelhante.
A solução que encontrei foi criar em uma classe que trabalhava com arquivos (manipulação, gravação, exclusão, etc) um atributo readonly com o caminho completo da aplicação. Como o objeto da classe é singleton, quando a aplicação web iniciar, um listener é chamado e preenchia um atributo da readonly da classe com o caminho da aplicação.
Assim, de qualquer lugar da aplicação é possível manipular arquivo sem me preocupar com o path (já que todos os metódos de manipulação de arquivos estão contidos dentro dessa classe).
Solução interessante, embora eu acredite que eu deva tomar muito cuidado com singletons e métodos estáticos =Z
Mas me diga, como ficou esse listener que roda no começo da aplicação?
Talvez ele me tenha a resposta de que preciso.
Muito obrigado pela ajuda, já foi de grande valia!
[quote=Tchello] Solução interessante, embora eu acredite que eu deva tomar muito cuidado com singletons e métodos estáticos =Z
Mas me diga, como ficou esse listener que roda no começo da aplicação?
Talvez ele me tenha a resposta de que preciso.
Muito obrigado pela ajuda, já foi de grande valia!
Abraços.[/quote]
Bem, com singletons e métodos estáticos todos nós devemos tomar cuidado. Mas se usado com cuidado e sem abusos, acretido que são de excelênte ajuda.
Sobre minha classe ficou assim (vou tomar com verdade que você conhece sobre listeners, rs!): Listener.java
public void contextInitialized(ServletContextEvent contextEvent) {
UtilArquivos.createInstance(contextEvent.getServletContext().getRealPath(""));
//outros fora do contexto do exemplo. Omitidos.
}
UtilArquivo.java
private String CAMINHO_DA_APLICACAO;
private static UtilArquivo INSTANCE;
private UtilArquivo(String caminhoDaAplicacao){
CAMINHO_DA_APLICACAO = caminhoDaAplicacao;
}
public static void createInstance(String caminhoDaAplicacao){
if(StringUtil.isNotEmpyt(caminhoDaAplicacao)){
INSTANCE = new UtilArquivo(caminhoDaAplicacao);
} else {
throw new InstantiationException("Caminho da aplicação não é valido!");
}
}
public static UtilArquivo getInstance(){
if(INSTANCE != null){
return INSTANCE;
}
throw new NullPointerExcepion("Não existe uma instância de UtilArquivo.");
}
public String getCaminhoDaAplicacao(){
return CAMINHO_DA_APLICACAO;
}
O que eu postei aqui foi apenas um modelo de como está aqui, já que assinei um documento de sigilo do código. Mas acho que deu pra entender a ideia.
Aprendiz, entendo perfeitamente e concordo com os comentários feitos.
Creio que eu não tenha sido claro em um ponto.
O meu sistema está dividido em duas aplicações, uma WEB e uma aplicação java “comum”.
A aplicação web trata a camada de apresentação e a “comum” cuida da camada de negócios, separadamente.
Enfim, na camada web consigo usar a listener e tudo mais, porém na outra camada já não disponho desses mesmos recursos, uma vez que não existe o “getServletContext()” e tudo mais. Daí não consigo usar o método getRealPath.
Sendo assim, como posso conseguir o diretório real das minhas imagens?
Queria algo do tipo:
[quote=Tchello] Aprendiz, entendo perfeitamente e concordo com os comentários feitos.
Creio que eu não tenha sido claro em um ponto.
O meu sistema está dividido em duas aplicações, uma WEB e uma aplicação java “comum”.
A aplicação web trata a camada de apresentação e a “comum” cuida da camada de negócios, separadamente.
Enfim, na camada web consigo usar a listener e tudo mais, porém na outra camada já não disponho desses mesmos recursos, uma vez que não existe o “getServletContext()” e tudo mais. Daí não consigo usar o método getRealPath.
Sendo assim, como posso conseguir o diretório real das minhas imagens?
Queria algo do tipo:
Isso funciona perfeitamente na camada web, mas não na de negócios.
Ambas possuem pacotes de imagens diferentes.
Muito obrigado pela ajuda![/quote]
Bom… Duas visões sobre o que me disse:
Ou… Os dois projetos estão ligados com dependências (projeto web depende do projeto comum). Se isso for verdade, o UtilArquivo.java é criado no projeto comum, podendo ser usando tanto no projeto WEB como no projeto comum.
Ou… Os dois projetos são totalmente separados. Se for assim, a melhor estrategia seja guardar a informação do caminho da aplicação(arquivo properties, arquivos xml, registro no banco da dados, etc).