[iReport][Resolvido] NullPointerException quando chamo pelo java

Galera,

estou com um problema bem chatinho:
Toda vez que chamo um relatório pelo java, eu recebo NPE de resposta.

Suspeito de algum problema de configuração.
De qualquer maneira, segue o código (considerem rs e vo genéricos):

[code]HashMap<String, Object> param=new HashMap<String, Object>();

param.put(“Sistema”, “Sipag Net”);

while (rs.next()) {
VoRelatorio vo = new VoRelatorio();
vo.setMES(rs.getString(1));
vo.setOPERACAO(rs.getString(2));
vo.setID_OBJETO_CGE(rs.getString(3));
vo.setQTD_ACESSOS(rs.getBigDecimal(4));
vo.setTEMPO_MIN(rs.getBigDecimal(5));
vo.setTEMPO_MAX(rs.getBigDecimal(6));
vo.setTEMPO_MEDIO(rs.getBigDecimal(7));
list.add(vo);
}

JRDataSource dataSource = new JRBeanCollectionDataSource(collection);

JasperPrint jasperPrint = JasperFillManager.fillReport(“report1.jasper”, params, dataSource);[/code]

Exceção lançada:

java.lang.NullPointerException at java.lang.Class.isAssignableFrom(Native Method) at net.sf.jasperreports.engine.fill.JRFillTextField.getFormat(JRFillTextField.java:706) at net.sf.jasperreports.engine.fill.JRFillTextField.evaluateText(JRFillTextField.java:394) at net.sf.jasperreports.engine.fill.JRFillTextField.evaluate(JRFillTextField.java:368) at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:258) at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:499) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2036) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:760) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:270) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:128) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:946) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:864) at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:84) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:624)

Importante ressaltar que o relatório abre normalmente pelo windows.

Pode ser um problema de fonte.
No caso vc cria um relatório que usa algumas fontes no windows e em outro SO não possua.
Vc pode estar instalando essas fontes ou usando somente a fonte scansrif

Não deve ser isso porque a aplicação roda no windows somente.

Verifique no relatório o se o formato dos campos está compativel com o que vc está passando…

Vi que vc passa alguns campos BigDecimal, o seu relatório está preparado para receber esse formato de campo???
Minha experiencia com iReport/JasperReport me ensinou que é melhor sempre trabalhar com tipos mais simples, primitivos de preferencia…

Abraço…

Digo isso porque já aconteceu algumas vezes comigo.
Coloco uma fonte que tem no windows, quando vou rodar em outro SO como o linux o Ireport quando vai gerar o relatório pede aquela fonte para o SO e não acha, ou seja fonte nula e gera exceção.

Digo isso porque já aconteceu algumas vezes comigo.
Coloco uma fonte que tem no windows, quando vou rodar em outro SO como o linux o Ireport quando vai gerar o relatório pede aquela fonte para o SO e não acha, ou seja fonte nula e gera exceção.
[/quote]

Comigo já aconteceu apenas mudando a distribuição do SO =/

E realmente Big Decimal eu não acho uma boa… Muda para um tipo mais simples de trabalhar mano =)

Digo isso porque já aconteceu algumas vezes comigo.
Coloco uma fonte que tem no windows, quando vou rodar em outro SO como o linux o Ireport quando vai gerar o relatório pede aquela fonte para o SO e não acha, ou seja fonte nula e gera exceção.
[/quote]

Comigo já aconteceu apenas mudando a distribuição do SO =/

E realmente Big Decimal eu não acho uma boa… Muda para um tipo mais simples de trabalhar mano =)[/quote]
Acredito que o BigDecimal não seja o problema já que ele faz parte da api padrão do java.

Digo isso porque já aconteceu algumas vezes comigo.
Coloco uma fonte que tem no windows, quando vou rodar em outro SO como o linux o Ireport quando vai gerar o relatório pede aquela fonte para o SO e não acha, ou seja fonte nula e gera exceção.
[/quote]

Comigo já aconteceu apenas mudando a distribuição do SO =/

E realmente Big Decimal eu não acho uma boa… Muda para um tipo mais simples de trabalhar mano =)[/quote]
Acredito que o BigDecimal não seja o problema já que ele faz parte da api padrão do java.
[/quote]

Não não mano, estou me referindo a outro problema, talvez os parâmetros enviados da aplicação não estão compatíveis com o BigDecimal do Jasper.

Algum valor de algum textField teu não aceita o Pattern que está sendo aplicado nele. Não que teu Pattern esteja errado, é algum dos valores do teu resultSet mesmo.
Pelo Java, queres dizer pela aplicação; e pelo Windows, diretamente pelo iReport? Porque se for, provavelmente há uma diferença nos dados recuperados entre um e outro.
Abraço!

Digo isso porque já aconteceu algumas vezes comigo.
Coloco uma fonte que tem no windows, quando vou rodar em outro SO como o linux o Ireport quando vai gerar o relatório pede aquela fonte para o SO e não acha, ou seja fonte nula e gera exceção.
[/quote]

Comigo já aconteceu apenas mudando a distribuição do SO =/

E realmente Big Decimal eu não acho uma boa… Muda para um tipo mais simples de trabalhar mano =)[/quote]
Acredito que o BigDecimal não seja o problema já que ele faz parte da api padrão do java.
[/quote]

Não não mano, estou me referindo a outro problema, talvez os parâmetros enviados da aplicação não estão compatíveis com o BigDecimal do Jasper.[/quote]
Troquei todos os valores de BigDecimal para Double. Mesmo erro. Achei que não tinha testado corretamente já que o erro não mudou uma linha sequer, mas conferi duas vezes o teste.

[quote=leoramos]Algum valor de algum textField teu não aceita o Pattern que está sendo aplicado nele. Não que teu Pattern esteja errado, é algum dos valores do teu resultSet mesmo.
Pelo Java, queres dizer pela aplicação; e pelo Windows, diretamente pelo iReport? Porque se for, provavelmente há uma diferença nos dados recuperados entre um e outro.
Abraço![/quote]

Pensei nisso que você disse e lembrei de umas gambís que fiz na consulta. Será que é isso mesmo? Resolvi verificar os tipos dos campos vindos do banco.
Segue a consulta para apreciação (relevem o XGH :roll: ):

//data_arquivo -> Date
select to_char(l.data_arquivo, 'MM/YYYY') as MES,
       //operacao -> VARCHAR2(20)
       l.operacao,
       //id_objeto_cge -> VARCHAR2(200)
       o.id_objeto_cge,
       //qtd_acessos -> NUMBER(10)
       sum(l.qtd_acessos) as QTD_ACESSOS,
       //tempo_minimo -> VARCHAR2(15)
       min(to_number(replace(l.tempo_minimo, '.', ','))) as TEMPO_MIN,
       //tempo_maximo -> VARCHAR2(15)
       max(to_number(replace(l.tempo_maximo, '.', ','))) as TEMPO_MAX,
       //tempo_medio_resposta -> VARCHAR2(15)
       avg(replace(l.tempo_medio_resposta, '.', ',')) as TEMPO_MEDIO
  from webadmin.web_logs_operacoes l, webadmin.web_operacoes_cr o
 where l.operacao = o.cod_operacao
   and l.data_arquivo >= '01/05/2011'
   and l.data_arquivo < '01/06/2011'
 group by to_char(l.data_arquivo, 'MM/YYYY'), l.operacao, o.id_objeto_cge
 order by to_char(l.data_arquivo, 'MM/YYYY'), 4 desc, 6 desc

Cara, vou fuçar na tua query aqui. Mas antes de mais nada, deixa eu te dar um toque.
Se quiseres debuggar esse negócio aqui, faz um laço que transforme os dados do teu resultSet em objetos com os mesmos tipos usados como fields no jasper. Assim consegues ver a exceção, debuggar e tudo e tudo mais.
Jogar a query direto no iReport não vai adiantar, pq a exceção gerada vai ser igual.
Vai postando aí que a gente ajuda.
Abraço!

Debuguei aqui do jeito que você falou. Não tive problemas de incompatibilidade, mas o mesmo erro.
Acho que o problema não está ligado a algo mutável como os dados ou tipos. Creio que seja algum tipo de atributo do jasper ou do iReport que precisa ser configurado.

EDIT:
Se eu não mandasse lista para preencher o relatório, era de se esperar que ele abrisse mostrando somente o Tittle. Qual a minha surpresa quando ele abre o relatório totalmente em branco!

Você tem variáveis ($V) nesse relatório? Alguma delas tem initialValue ou coisa assim?

Somente as variáveis padrão (PAGE_NUMBER, COLUMN_NUMBER…)

Alguma operação entre campos? Tipo uma adição num textField.
(Tô chutando pra tudo que é lado, agora, pq nem o google tá ajudando nessa)

O Google foi o primeiro a me abandonar.
Sem adições, subtrações ou operações nos campos. Somente recebem os valores.

Mais duas pistas:
1 - Ele mostrou em branco porque estava setado no iReport “When No Data: Blank Page” (D’oh!). Foi só setar para “When No Data: All Sections, No Detail” que ele mostrou o Tittle.

2 - Eu passo um parâmetro Sistema pro report. Não sei se ele recebe direitinho, mas se eu inserir esse parâmetro no report, ele dá o mesmo erro.

EDIT: Outra pista: Se eu não coloco os FIELDS ($F) no report, ele abre com todas as 6 páginas (!) só que em branco, óbvio.

EDIT2: *

Meu senhor, que rolo… tô até meio tonto.
Que parâmetro é esse? O que tu faz com ele no layout?
Reformulando: como tu formata esse parâmetro depois? Qual o tipo de dado?
Abraço!

É isso mesmo! O report completo tem 6 páginas, eu testei abrindo pelo iReport. O grande porquê é porque diabos ele lança exceção se mandamos mostrar os campos.

Cara… eu não queria dizer isso, mas… sai do fusca e entra de novo.
Deleta os textFields todos e inclui eles sem formatação nenhuma, só com o tipo que tu tá mandando pelo Java.
Ou, se quiseres ir aos poucos: deleta um, testa, ctrl + z; deleta outro, testa, ctrl + z… técnica do chimpanzé, mas é a vida =/
Abraço!

4 dias empacado nesse erro. 4 dias!

Um colega de trabalho me ajudou a descobrir:
Os jars usados são para uma versão mais antiga (a desse meu colega, de quem peguei). A minha é a 4.1.1 e a dele 4.0.2.

Solução: Desinstalei o iReport e baixei a versão dele.

4 dias! 4 malditos dias!