Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

JasperReport com Vraptor - como faço o request.getServletContext().getRealPath dentro de um Controller

Olá!

Como faço pra colocar o caminho do relatório .jasper dentro de um Controller?

Não estou conseguindo adaptar a linha:

String nome = request.getServletContext().getRealPath("/WEB-INF/jasper/gasto_por_mes.jasper");

Tentei fazer assim: declarei a variável

private ServletContext aplicacao;

E depois dentro do método:

String jasperpath = application.getRealPath("/WEB-INF/jasper");

Mas o diretorio que mostra é do: tomcat (C:\Projetos\Tomcat\apache-tomcat-7.0.79\wtpwebapps\projeto1), e deveria ser do projeto (C:\Projetos\Java\projeto1\src\main\webapp\WEB-INF\jasper)

10 respostas

`Coloca o binário dentro do src de seu projeto, tipo em

src/relatorio/meuRelatorio.jasper

Para recuperar faça assim:

public Relatorio(Object obj) { super(); InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("relatorio/meuRelatorio.jasper"); JasperReport report = (JasperReport) JRLoader.loadObject(inputStream); // Ai segue do padrao JRDataSource dataSource = ... Map<String, Object> parameters = ... JasperPrint print = JasperFillManager.fillReport(report, parameters, dataSource); ... }

Se o inputStream view nulo verifique se o netbeans está incluindo os recursos no pacote(Não mexo com netbeans).

Seu projeto é um JAR ou WAR?.

De toda forma o NetBeans tem uma ferramenta para gerar o pacote do projeto, gere o pacote e verique onde foi parar seu '.jasper'.

Se não estiver no pacote verifique a configuração do seu projeto no NetBeans. Se estiver lá é simples:

Projeto JAR:

JAR/relatorio/meuRelatorio.jasper recupera com this.getClass().getClassLoader().getResourceAsStream("relatorio/meuRelatorio.jasper")

JAR/META-INF/relatorio/meuRelatorio.jasper recupera com this.getClass().getClassLoader().getResourceAsStream("META-INF/relatorio/meuRelatorio.jasper")

Projeto WAR:

WAR/WEB-INFO/classes/relatorio/meuRelatorio.jasper recupera com this.getClass().getClassLoader().getResourceAsStream("relatorio/meuRelatorio.jasper")

WAR/WEB-INFO/relatorio/meuRelatorio.jasper recupera com this.getClass().getClassLoader().getResourceAsStream("WEB-INF/relatorio/meuRelatorio.jasper")

`

Olá André Victor! Estou utilizando Eclipse e Vraptor com tomcat e hibernate e estou implementando relatórios com JasperReport.

Fiz os ajustes :

InputStream jasperpath = this.getClass().getClassLoader().getResourceAsStream("WEB-INF/jasper/lista_usuario.jasper");

JasperReport report = (JasperReport) JRLoader.loadObject(jasperpath);

Mas apareceu a página:

HTTP Status 500 - java.lang.NullPointerException


type Exception report

message java.lang.NullPointerException

description The server encountered an internal error that prevented it from fulfilling this request.

exception 
javax.servlet.ServletException: java.lang.NullPointerException
    br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:122)



root cause 
java.lang.NullPointerException
    java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2620)
    java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2636)
    java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:3113)
    java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:853)
    java.io.ObjectInputStream.<init>(ObjectInputStream.java:349)
    net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream.<init>(ContextClassLoaderObjectInputStream.java:58)
    net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:244)
    net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:229)
    br.com.caelum.vraptor.controller.AutorController.geradorRelatorio(AutorController.java:97)
    br.com.caelum.vraptor.controller.AutorController$Proxy$_$$_WeldClientProxy.geradorRelatorio(Unknown Source)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:498)
    net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:38)
    net.vidageek.mirror.invoke.MethodHandlerByMethod.withArgs(MethodHandlerByMethod.java:54)
    br.com.caelum.vraptor.observer.ExecuteMethod.execute(ExecuteMethod.java:87)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:498)
    org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:93)
    org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:266)
    org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:253)
    org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:232)
    org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:169)
    org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:165)
    org.jboss.weld.event.ObserverNotifier.notifyObservers(ObserverNotifier.java:119)
    org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:112)
    org.jboss.weld.event.EventImpl.fire(EventImpl.java:83)
    br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:78)
    br.com.caelum.vraptor.core.DefaultInterceptorStack$Proxy$_$$_WeldClientProxy.next(Unknown Source)
    br.com.caelum.vraptor.interceptor.DefaultSimpleInterceptorStack.next(DefaultSimpleInterceptorStack.java:49)
    br.com.caelum.vraptor.interceptor.DefaultSimpleInterceptorStack$Proxy$_$$_WeldClientProxy.next(Unknown Source)
    br.com.caelum.vraptor.seguranca.AutorizacaoInterceptor.intercept(AutorizacaoInterceptor.java:41)
    br.com.caelum.vraptor.seguranca.AutorizacaoInterceptor$Proxy$_$$_WeldClientProxy.intercept(Unknown Source)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:498)
    net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:38)

O NullPointerException é uma exceção lançada pelo Java quando um programa tenta acessar um objeto de memória que não foi instanciado (ou melhor, inicializado) até o momento de sua chamada.

Agora que objeto ele tava tentando acessar?

o Método está assim, acho q o problema está no 3º parametro q passo para o JaspeFillManager... No caso exemplo estou tentando usar somente com a passagem do primeiro e do segundo parâmetro.

public void geradorRelatorio() throws FileNotFoundException, JRException{

        InputStream jasperpath = this.getClass().getClassLoader().getResourceAsStream("WEB-INF/jasper/lista_usuario.jasper");

        JasperReport report = (JasperReport) JRLoader.loadObject(jasperpath);
        Map<String, Object> parametros = new HashMap<String, Object>();
        JasperPrint print = JasperFillManager.fillReport("jasperpath", parametros);

        JRExporter exporter = new JRPdfExporter();
        exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
        exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, new FileOutputStream("lista_usuario.pdf"));
        exporter.exportReport();
    }
}

Esse 3º parâmetro é a conexão... mas no caso eu já uso o EntityManagerFactory

@ApplicationScoped
public class EntityManagerProducer {
    private static EntityManagerFactory factory = 
            Persistence.createEntityManagerFactory("default");

        @Produces @RequestScoped   
        public EntityManager getEntityManager(){
            return factory.createEntityManager();
        }

        public void close(@Disposes EntityManager manager){
            manager.close();
        }

}

Tentei fazer aqui criando uma variável manager

private EntityManager manager;

Mas ai o JasperFillManager não aceita. E me parece duplicidade criar outra classe de Connection. O que você acha??

Cara só por desencargo tenta criar outra classe de Connection. Tá bem difícil esse problema mesmo. Está usando na empresa essa solução ou é só pra fins didáticos?

é mais pra eu aprender mesmo. estou praticando em casa como faz. Resolvi começar um projeto com o Vraptor ai vim rever esse video de JasperReport do Alura pra implementar nele.

Cara, estou tentando a connection do mysql, mas não está funcionando. Diz que é devido meu MySQL ser a versão 8. Mas já ajustei aqui o driver pro mysql 8... e mesmo usando os mesmos parametros que uso no persistence não está funcionando.

Tentei desinstalar o mysql8 e instalar o 5. Mas o update pro 8 acontece automaticamente, e se forço ficar no 5 no meio do caminho pede o updade pro 8. afff.

Também não estou encontrando aqui material do Jasper com Vraptor e mysql8. T_T

Estou tentando variações aqui... mas essas coisas tem que ser com um material mais certo, ainda mais pra iniciante como eu. Percebi que ficar variando assim, acabo colocando coisas atoas no projeto e depois dá um trabalho pra retirar sem estragar o projeto.

Cara essas coisas que está desenvolvendo são muito avançadas. Eles pagam profissionais caros pra lidar com essas coisas.

Vi seu perfil no Alura e se você visse os cursos de Java antes, ou se já tem conhecimento desse uma revisada? Assim você fortifica a sua base e se prepara para lidar com o complicado.

Afinal para matar dragões é necessário ser high level né?

Tem alguma ferramenta mais simples pra fazer relatório em pdf nesse ambiente? bem basicam mesmo... são relatórios de listagem tpw: select * from usuario; select * from livro etc.

solução!

Tem sim. Você tá no ambiente web né? Usa uma ferramenta no lado do client em Javascript. Assim você economiza recurso do seu servidor tb. Monta a página HTML e exporta pra PDF. Dei uma pesquisada e achei esses dois https://github.com/MrRio/jsPDF https://www.c-sharpcorner.com/blogs/how-to-convert-html-with-css-to-pdf-using-javascript

Valeu André!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software