Gerando Boleto com Stella Caelum Banco Bradesco

Bom dia, estou tentando utilizar o stella boleto para gerar um boleto para o banco Bradesco conforme código que segue, estou utilizando a IDE Intellij

import br.com.caelum.stella.boleto.*;
import br.com.caelum.stella.boleto.bancos.Bradesco;
import br.com.caelum.stella.boleto.transformer.GeradorDeBoleto;

import java.io.File;

/**
 * Created by Marcos Vinicius on 30/11/16.
 */
public class SemearBoleto  {


        public static void main(String[] args) {

            Datas datas = Datas.novasDatas()
                    .comDocumento(1, 5, 2016)
                    .comProcessamento(1, 5, 2016)
                    .comVencimento(2, 12, 2016);

            Endereco enderecoBeneficiario = Endereco.novoEndereco()
                    .comLogradouro("Av das Empresas, 555")
                    .comBairro("Bairro Grande")
                    .comCep("01234-555")
                    .comCidade("São Paulo")
                    .comUf("SP");

            //Quem emite o boleto

            Beneficiario beneficiario = Beneficiario.novoBeneficiario()
                    .comNomeBeneficiario("Fulano de Tal")
                    .comAgencia("1824").comDigitoAgencia("4")
                    .comCodigoBeneficiario("76000")
                    .comDigitoCodigoBeneficiario("5")
                    .comNumeroConvenio("1207113")
                    .comCarteira("18")
                    .comEndereco(enderecoBeneficiario)
                    .comDocumento("05.606.206/0001-83")
                    .comNossoNumero("9000206").comDigitoNossoNumero("3");

            Endereco enderecoPagador = Endereco.novoEndereco()
                    .comLogradouro("Av dos testes, 111 apto 333")
                    .comBairro("Bairro Teste")
                    .comCep("01234-111")
                    .comCidade("São Paulo")
                    .comUf("SP");

            //Quem paga o boleto

            Pagador pagador = Pagador.novoPagador()
                    .comNome("Fulano da Silva")
                    .comDocumento("111.222.333-12")
                    .comEndereco(enderecoPagador);

            Banco banco = new Bradesco();

            Boleto boleto = Boleto.novoBoleto()
                    .comBanco(banco)
                    .comDatas(datas)
                    .comBeneficiario(beneficiario)
                    .comPagador(pagador)
                    .comValorBoleto("200.00")
                    .comNumeroDoDocumento("1234")
                    .comInstrucoes("instrucao 1", "instrucao 2", "instrucao 3", "instrucao 4", "instrucao 5")
                    .comLocaisDePagamento("local 1", "local 2");

            GeradorDeBoleto gerador = new GeradorDeBoleto(boleto);


            System.out.println(gerador.toString());
            File pdf = new File("/home/hortela/testeboleto/BancoBradesco.pdf");
            gerador.geraPDF(pdf);

        }

}

Está retornando o erro conforme abaixo:

Exception in thread “main” java.lang.NullPointerException
at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2338)
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2351)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2822)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:804)
at java.io.ObjectInputStream.(ObjectInputStream.java:301)
at net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream.(ContextClassLoaderObjectInputStream.java:58)
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:244)
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:229)
at br.com.caelum.stella.boleto.transformer.GeradorDeBoleto.(GeradorDeBoleto.java:61)
at br.com.caelum.stella.boleto.transformer.GeradorDeBoleto.(GeradorDeBoleto.java:73)
at SemearBoleto.main(SemearBoleto.java:64)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

Na verdade o código já para na linha : GeradorDeBoleto gerador = new GeradorDeBoleto(boleto);

Pela minha pouca experiência entendi que algum valor nulo não está deixando instanciar o objeto, porém, não consegui identificar qual variável específica. Rodei o debug e não consegui identificar onde possa estar o erro.

veja, o construtor:

public GeradorDeBoleto(Collection<Boleto> boletos) {
		this.boletos = boletos;
		try {
			templateJasper = GeradorDeBoleto.class.getResourceAsStream("/br/com/caelum/stella/boleto/templates/boleto-default.jasper");
			parametros.put(JRParameter.REPORT_LOCALE, new Locale("pt", "BR"));
			InputStream template_sub = GeradorDeBoleto.class.getResourceAsStream("/br/com/caelum/stella/boleto/templates/boleto-default_instrucoes.jasper");
			parametros.put("SUB_INSTRUCOES", JRLoader.loadObject(template_sub));
		} catch (JRException e) {
			throw new GeracaoBoletoException(e);
		}
	}

provavelmente seu Nullpointer está aqui:
InputStream template_sub = GeradorDeBoleto.class.getResourceAsStream("/br/com/caelum/stella/boleto/templates/boleto-default_instrucoes.jasper");

pode estar retornando null e na linha seguinte ao realizar o:

parametros.put("SUB_INSTRUCOES", JRLoader.loadObject(template_sub));

causa o NullPointer,

confira se você está com todas as libs no seu classpath, conforme a documentação:

Configurando o Ambiente

Lista de jars necessários no classpath:

caelum-stella-core 2.x
caelum-stella-boleto 2.x
jasperreports 5.5.0
commons-beanutils 1.8.x
commons-collections 2.1
commons-digester 2.1
commons-logging 1.1.1
itext 2.1.7
barbecue 1.5

Getulio, identifiquei que o nome dos templates
estava diferente com o que eu estava utilizando, sendo assim, alterei o
"boleto-default.jasper" para “boleto-default.jrxml” e o
"boleto-default_instrucoes.jasper" para
"boleto-default_instrucoes.jrxml".

O erro agora mudou:

Exception in thread "main"
br.com.caelum.stella.boleto.exception.GeracaoBoletoException:
net.sf.jasperreports.engine.JRException: Error loading object from
InputStream
at br.com.caelum.stella.boleto.transformer.GeradorDeBoleto.(GeradorDeBoleto.java:63)
at br.com.caelum.stella.boleto.transformer.GeradorDeBoleto.(GeradorDeBoleto.java:73)
at SemearBoleto.main(SemearBoleto.java:66)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: net.sf.jasperreports.engine.JRException: Error loading object from InputStream
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:249)
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:229)
at br.com.caelum.stella.boleto.transformer.GeradorDeBoleto.(GeradorDeBoleto.java:61)
… 7 more
Caused by: java.io.StreamCorruptedException: invalid stream header: 3C3F786D
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:808)
at java.io.ObjectInputStream.(ObjectInputStream.java:301)
at net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream.(ContextClassLoaderObjectInputStream.java:58)
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:244)
… 9 more

Na verdade acredito que você não deva fazer isso,
conforme a documentação:

Jasper files, are jrxml files compiled into Java bytecode

net.sf.jasperreports.engine.JRException: Error loading object from 
InputStream

Esse erro é bem tipico dessa situação,

veja a linha:
InputStream template_sub = GeradorDeBoleto.class.getResourceAsStream("/br/com/caelum/stella/boleto/templates/boleto-default_instrucoes.jasper");

esses .jasper estão dentro do jar, qual versão você está utlizando? está resolvendo as dependencias com Maven?

Getúlio, no código da Caelum os arquivos estão como jrxml, por isso fiz a alteração no código. Estou utilizando o jasper 5.5 conforme indicado na documentação. Veja na imagem que segue os arquivos dentro do diretório template, o código fonte baixei direto do Github.

Estou utilizando o código da Caelum para adaptar à emissão de um formato específico de boleto. Sendo assim, baixei todo o código fonte, fiz algumas alterações apenas nos campos do boleto do Bradesco, já que seguirá o mesmo padrão, e gerei um JAR para utilizar na minha aplicação.
Sobre as dependências com Maven não sei como ficaria

Marcos,

você gerou o jar com o maven?
dei uma olhada no pom.xml do projeto no git e ele tem o compilador de reports no processo de build.

<artifactId>caelum-stella-boleto</artifactId>
<packaging>jar</packaging>
<name>Stella Boleto</name>

<groupId>org.codehaus.mojo</groupId>
<artifactId>jasperreports-maven-plugin</artifactId>
<versionRange>[1.0-beta-2,)</versionRange>
<goals>
	<goal>compile-reports</goal>
</goals>

volte o codigo dos .jasper e gere o jar pelo mvn dai coloque o novo jar no seu projeto e veja se funciona.

Gerei o jar no Intellij utilizando o build artifacts, com o arquivo mvn no projeto.

Alterei para .jasper e voltou ao problema do NullPointer

Problema resolvido, utilizei a versão 5.1 do JasperReports e consegui fazer a emissão do boleto.

1 curtida