Olá amigos do GUJ,
Estou precisando pegar um arquivo que está em um dos meus pacotes da aplicação web, mas não sei como… pelos pacotes ele fala que não consegue recuperar!
É um exemplo de iReport e eu preciso pegar o .jrxml
JasperDesign design = JRXmlLoader.load("com.letsparty.commands.report.RelatorioUsuarios.jrxml");
Ele dá problema justamente nessa linha.
Como eu poderia pegar esse arquivo?
Rapaz, se você está fazendo dpeloy usando um arquivo war, eu tenho quase certeza de que você deve usar o FileResourceServlet. Dà uma olhada aqui.
Se ainda não rolar, procura uma forma de pegar um arquivo de dentro de um jar (só dar um this.getClass().getResource(“path”)). Isso é muito comum em aplicações Swing que possuem imagens (ícones). Fica tudo encapsulado dentro do jar.
Só fica atento pra um detalhe: você não pode modificar o arquivo.
Editado daqui pra baixo.
Mas me diz uma coisa: por que você quer pegar do war? Você pode colocar o jrxml dentro do war sem problema algum. O Tomcat, depois que você faz deploy, cria uma pasta com a estrutura do war e você tem seus arquivos ali. Se não der pelo pacote, tente trocar os “.” por “/”.
De qualquer forma, acho que é mais problema de JasperReports do que de WAR. Posta a stacktrace da Exception, fazendo um favor.
O StackTrace é esse aqui:
net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: com.letsparty.commands.report.RelatorioUsuarios.jrxml (O sistema não pode encontrar o arquivo especificado)
at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:172)
null
at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:152)
at com.letsparty.commands.report.UsersReportCommand.onExecute(UsersReportCommand.java:34)
at com.letsparty.controller.command.AbstractCommand.execute(AbstractCommand.java:17)
at com.letsparty.controller.Controller.processRequest(Controller.java:18)
at com.letsparty.controller.Controller.doGet(Controller.java:24)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.io.FileNotFoundException: com.letsparty.commands.report.RelatorioUsuarios.jrxml (O sistema não pode encontrar o arquivo especificado)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:167)
... 26 more
28/05/2011 13:31:01 com.letsparty.controller.command.AbstractCommand execute
É como se ele não conseguisse encontrar o arquivo! :S
Acho que não me expressei bem nesse tópico.
O problema parece ser simples e eu é que estou complicando.
Eu quero apenas ler um arquivo que está em um dos pacotes da minha aplicação web e não sei como fazer.
Eu tentei fazer igual faço na aplicação desktop
getClass().getResource("RelatorioUsuarios.jrxml");
Mas ele só dá NullPointerException…
Procurei em outros tópicos aqui do GUJ mas geralmente as respostas usam ServletContext que “não existe” mais…
Não existe?
Em anexo uma app para o GlassFish e funciona tambem no tomcat.
Usando Java EE 6 no glass e Java EE 5 no tomcat.
Desculpe, me expressei errado!
Não existe é jeito de pegar o objeto ServletContext a partir de request ou response, que são os objetos que tenho disponível nas minhas classes Command
Mas o request tem um método que retorna o ServletContext.
Não existe?
Substitua o codigo
InputStream input =getServletContext().getClassLoader().getResourceAsStream("reports/RelatorioExemplo.jasper");
Por este
InputStream input =request.getServletContext().getClassLoader().getResourceAsStream("reports/RelatorioExemplo.jasper");
Aqui funcionou…
Confundi ali em cima, na verdade em HttpSession não foi removido, quem foi depreciado foi getSessionContext() =P
Mas mesmo assim, não aparece quando estou programando aqui:
http://imageshack.us/photo/my-images/694/problemak.png/
Veja que o ServletContext está disponivel no Request.
InputStream input =request.getServletContext().getClassLoader().getResourceAsStream("reports/RelatorioExemplo.jasper");
Não no Session. Teste ai…
Veja o exemplo que postei. Faça a alteração que sugeri.
Aqui tá funcionando.