Pegar arquivo a partir de projeto web

12 respostas
diogozero

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?

12 Respostas

Andre_Brito

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.

diogozero

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

diogozero

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…

71C4700

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.

diogozero

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

71C4700

Mas o request tem um método que retorna o ServletContext.

diogozero

Não tem, já procurei.

http://download.oracle.com/javaee/5/api/javax/servlet/http/HttpServletRequest.html

E em HttpSession, o método já foi removido
http://download.oracle.com/javaee/5/api/javax/servlet/http/HttpSession.html

71C4700

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…

diogozero

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/

71C4700

Veja que o ServletContext está disponivel no Request.

InputStream input =request.getServletContext().getClassLoader().getResourceAsStream("reports/RelatorioExemplo.jasper");

Não no Session. Teste ai…

diogozero

Também não! :stuck_out_tongue:

http://imageshack.us/photo/my-images/84/problemab.png/

71C4700

Veja o exemplo que postei. Faça a alteração que sugeri.

Aqui tá funcionando.

Criado 27 de maio de 2011
Ultima resposta 28 de mai. de 2011
Respostas 12
Participantes 3