iReport - Could not load object from location [Não resolvido]

Galera,

Seguinte, tenho um relatório que chama um subrelatório. Visualizando pelo iReport, ele consegue chamar o subrelatório, porém no java não.
Tenho um jar adicionado na minha app. que possui os .jasper. Aí busco eles assim:

InputStream pathRelGeral = getClass().getClassLoader().getResourceAsStream("RelatorioGeral.jasper"); InputStream pathSubRel = getClass().getClassLoader().getResourceAsStream("SubrelPausasDetalhe.jasper");
Passo como parâmetro para o relatório principal o subrelatório assim:

Map<String, Object> paramsRelGeral = new HashMap<String, Object>();
paramsRelGeral.put("SUBREPORT_DIR", pathSubRel);        

E o parâmetro SUBREPORT_DIR do relatório principal no iReport está configurado assim (Isso na aba Sub-relatório):

$P{SUBREPORT_DIR} + "SubrelPausasDetalhe.jasper"

Pensei que pudesse ser algum problema relacionado ao tipo das variáveis pathRelGeral e pathSubRel que são do tipo InputStream. Porém já alterei no ireport passando o tipo de SUBREPORT_DIR que é atualmente Object para InputStream e mesmo assim a exceção abaixo é lançada:

net.sf.jasperreports.engine.JRException: Could not load object from location : sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream@19a19fdSubrelPausasDetalhe.jasper

Galera, algum ser caridoso que possa me ajudar?

Bruno, você conseguiu matar esse problema?
Eu fui criar um main de testes aqui:

try{ String caminhoRelatorio = "./WEB-INF/report/Principal.jasper"; String caminhoSubRelatorio = "./WEB-INF/report/Auxiliar.jasper"; JasperReport relatorio = (JasperReport) JRLoader.loadObject(caminhoRelatorio); JasperReport subRelatorio = (JasperReport) JRLoader.loadObject(caminhoSubRelatorio); Map&lt;String, Serializable&gt; parameters = new HashMap&lt;String, Serializable&gt;(); parameters.put("subrelatorio", caminhoSubRelatorio); ...demais dados... }catch(JRException e){ e.printStackTrace(); } catch(Exception e){ e.printStackTrace(); }
E sempre recebo uma stack:
net.sf.jasperreports.engine.JRException: Could not load object from location : ./Auxiliar.jasper
Isso só ocorre com o subrelatório, que no relatório principal tá apontado assim:

Tentei usar o getClass()…getClassLoader().getResourceAsStream(…) e também não obtive sucesso.

O que eu aprendi em livro é transformar o path relativo em físico. Funciona 100%.

Eu não entendi direito a sua afirmação.Sim, eu posso dar um:new File("/report").getCanonicalPath() e descobrir o caminho,mas num servidor(por exemplo) não se tem essa facilidade.Pode-se mudar de Diretório(do E para o G por exemplo) e vc nem fica sabendo.
Aliás, eu tô com o mesmo problema com a exibição do meu banner pelo IReport.o Caminho completo “C:…” sempre funciona, mas o relativo nunca. :evil:

Tb não entendi o seu problema, olha como faço:

ServletContext scontext = (ServletContext)context.getExternalContext().getContext(); parameters.put("SUBREPORT_DIR", scontext.getRealPath("CAMINHODODIRETORIORELATIVOAQUI/")+"/");

Podem mudar de lugar em qualquer canto que funciona 100%. E eu uso no servidor host.

Usando servlet context, eu creio que realmente irá funcionar.Mas e se vc estiver de forma desktop?

E porque ao inves de utilizar :

Voce passa o caminho do relatorio como paramtro,sendo este completo? Ai voce só teria no relatorio

Ficaria mais facil de controlar…

String path = "/relatorio/"; File file = new File(path); file = file.getAbsoluteFile( );

Na verdade, não! :smiley:
Eu passo ele completo quando eu estou testando aqui, mas não quando eu quero por num servlet.


ServletContext scontext = (ServletContext)context.getExternalContext().getContext();
parameters.put(“SUBREPORT_DIR”, scontext.getRealPath(“CAMINHODODIRETORIORELATIVOAQUI/”)+"/");

Funciona para os reports, mas não sei pq não funciona para o Logo!Tipo:"./WEB-INF/report/Logo.jpg"; nunca acha o logotipo do relatório!

olá
estou tentando fazer a mesma coisa e estou com o mesmo problema
alguém resolveu ? como ?
obrigado

Na verdade, não! :smiley:
Eu passo ele completo quando eu estou testando aqui, mas não quando eu quero por num servlet.


ServletContext scontext = (ServletContext)context.getExternalContext().getContext();
parameters.put(“SUBREPORT_DIR”, scontext.getRealPath(“CAMINHODODIRETORIORELATIVOAQUI/”)+"/");

Funciona para os reports, mas não sei pq não funciona para o Logo!Tipo:"./WEB-INF/report/Logo.jpg"; nunca acha o logotipo do relatório! [/quote]

Olá…
Cara, depois de penar um tempo sobre a melhor estratégia de passar os caminhos necessários para gerar os relatórios (inclusive as imagens) fiz assim:
Quando a aplicação sobre no tomcat, tenho uma Listener que é chamado e é responsável por setar o caminho fisíco da aplicação:

Então, quando eu preciso informar o caminho dos relatórios, apenas faço:

O corpo do método é:

     return getCaminhoFisicoDaAplicacao().append("/WEB-INF/relatorios/"); 

e para as imagens faço

O corpo do método é:

     return getCaminhoFisicoDaAplicacao().append("/img/"); 

Bem simples, mas funciona bem bacana.

[]'s
JL

mas usando servlet ficaria exclusivo para web correto ?
se colocar o caminho, usando file, ficaria para desktop

meu problema é que vou usar esse relatorio no java web start

também estou com um problema similar.
tenho um relatorio com alguns sub-relatorios.
estou usando o netbeans… minha aplicação é em swing.
quando executo pelo netbeans, funciona normal…
mas quando vou executar o .jar da distribuição, ele não acha o sub_relatorio.jasper…

estou passando o parametro SUBREPORT_DIR com a url completa…
tipo: file:…/…/Aplicacao.jar?/…/…/relatorios/
ou algo parecido… sei que é o mesmo caminho que uso para achar o inputstream do relatorio principal…

acabei de ler aqui na intenet que, se vc passar o parametro SUBREPORT_DIR como “” (string vazia),
o jasper usa o mesmo diretorio do relatorio raiz…

vou testar e posto o retorno…

alguém conseguiu?