Olá Pessoal, tudo bom?
No artigo de hoje iremos passar uma classe DTO como parâmetro para um relatório Jasper. O artigo será baseado nesse artigo de um parâmetro String. Veja na continuação.
Antes de continuar a leitura…
Nesse artigo utilizamos o pattern DTO. Se você não sabe o que significa DTO, por favor leia o artigo.
Criando o Parâmetro
Baseado na parte 1 do artigo sobre Parâmetros do Jasper vamos criar um novo parâmetro e na parte Properties iremos alterar os seguintes itens, como mostra Figura 02:
- Name: colocar enderecoDTO
- Class: colocar br.com.mauda.dto.EnderecoDTO referenciando assim o dto criado.
Utilizando o Parâmetro
Baseado na parte 2 do artigo sobre Parâmetros vamos criar sete Text Fields onde utilizaremos em cada um o atributo correspondente do DTO.
No Editor Expression, Figura 03, para cada Text Field vamos fazer uma expressão diferente.
As expressões estão em ordem alfabética por atributo:
- Atributo bairro: “Bairro: ” + $P{enderecoDTO}.getBairro()
- Atributo cidade: “Cidade: ” + $P{enderecoDTO}.getCidade()
- Atributo complemento: “Complemento: ” + $P{enderecoDTO}.getComplemento()
- Atributo estado: “Estado: ” + $P{enderecoDTO}.getEstado()
- Atributo numero: “Número: ” + $P{enderecoDTO}.getNumero()
- Atributo pais: “País: ” + $P{enderecoDTO}.getPais()
- Atributo rua: “Rua: ” + $P{enderecoDTO}.getRua()
É importante frisar aqui que podemos chamar qualquer método existente na classe EnderecoDTO desta forma. Por exemplo se tivéssemos um método que retornasse a cidade/estado de nome getCidadeEstado(), bastaria colocar esse na expressão.
Criando o parâmetro dentro do código Java
Baseado na parte 3 do artigo sobre Parâmetros vamos agora modificar o código para adicionar essa nova instância de EnderecoDTO e passá-la ao relatório.
O software agora muda, vamos voltar ao Eclipse e mexer com o código Java. Se você, caro leitor, seguiu os passos desse tutorial de configuração do projeto Maven com o Jasper, provavelmente você tenha em seu projeto uma classe Java de teste para ser executada via JUnit. O código desta classe está no quadro abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
package br.com.mauda.SeminariosCientificos; import org.junit.Test; import net.sf.jasperreports.engine.JREmptyDataSource; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.JasperFillManager; /** * Unit test for simple App. */ public class AppTest{ @Test public void teste() throws JRException{ //Obtem o valor atual do sistema long inicioContagem = System.currentTimeMillis(); //Compilacao no formato jasper para o jrprint JasperFillManager.fillReportToFile("reports/relatorioTeste.jasper", null, new JREmptyDataSource(1)); System.err.println("Tempo de compilacao jasper -> jrprint: " + (System.currentTimeMillis() - inicioContagem)); //Reinicia o contador inicioContagem = System.currentTimeMillis(); //Geracao do PDF JasperExportManager.exportReportToPdfFile("reports/relatorioTeste.jrprint"); System.err.println("Tempo de geracao do PDF: " + (System.currentTimeMillis() - inicioContagem)); } } |
Agora vamos modificar essa classe com novos itens, para que possamos adicionar o novo parâmetro enderecoDTO e gerar o novo relatório criado via Jaspersoft Studio:
Criar uma instância de EnderecoDTO e preenche-la com informações. (linhas 20 a 27)
Criar uma instância de Map<String, Object> (linha 29), pois podemos passar parâmetros de qualquer tipo para o Jasper Reports, mas a Key deste sempre será uma String.
Adicionar o novo parâmetro ao Map, com o “enderecoDTO ” e a instância de EnderecoDTO (linha 30).
Por fim esse Map será passado ao método fillReportToFile (linha 33), conforme demonstra o código abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
package br.com.mauda.seminario.cientificos.bc; import org.junit.Test; import net.sf.jasperreports.engine.JREmptyDataSource; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.JasperFillManager; /** * Unit test for simple App. */ public class AppTest{ @Test public void teste() throws JRException{ //Obtem o valor atual do sistema long inicioContagem = System.currentTimeMillis(); EnderecoDTO enderecoDTO = new EnderecoDTO(); enderecoDTO.setRua("Alferes Poli"); enderecoDTO.setNumero(78445); enderecoDTO.setComplemento("Apto 345"); enderecoDTO.setBairro("Parque do Limoeiro"); enderecoDTO.setCidade("Antonia"); enderecoDTO.setEstado("Parana"); enderecoDTO.setPais("Brasil"); Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("enderecoDTO", enderecoDTO); //Compilacao no formato jasper para o jrprint JasperFillManager.fillReportToFile("reports/relatorioTeste.jasper", parameters, new JREmptyDataSource(1)); System.err.println("Tempo de compilacao jasper -> jrprint: " + (System.currentTimeMillis() - inicioContagem)); //Reinicia o contador inicioContagem = System.currentTimeMillis(); //Geracao do PDF JasperExportManager.exportReportToPdfFile("reports/relatorioTeste.jrprint"); System.err.println("Tempo de geracao do PDF: " + (System.currentTimeMillis() - inicioContagem)); } } |
Se você modificou o nome do relatório de teste faça a modificação nas linhas 33 e 40.
Agora é executar o código via JUnit e ver surgir um arquivo pdf com o título passado pelo código Java, Seminário sobre Jasper Reports, no arquivo PDF.
finally{
Assim terminamos a descrição sobre como criar e enviar parâmetros DTO para um relatório.
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Samuel says
O Jasper nao consegue encontrar a classe DTO que eu passei para ele, com.unipampa.sete.dto.EnderecoDTO
Mauda says
Olá Samuel, tudo bem?
Precisaria de mais algumas informações, pois só com essas não é possível te ajudar.
O arquivo jasper está dentro do próprio projeto que você está rodando o relatório? Ou está em outro projeto?
Existe alguma mensagem de erro?
Você recompilou o relatório novamente?
Obrigado.