terça-feira, 6 de janeiro de 2015

Erro ao gerar pdf com JasperReports

Numa aplicação de um cliente numa parte da app gerava um pdf e o enviava anexado a um email. No ambiente de desenvolvimento que no meu caso é Windows ou Mac funcionava corretamente ao colocar no servidor de produção que é Linux a mesma rotina retornava os erros:

Could not initialize class 
net.sf.jasperreports.engine.util.JRStyledTextParser
ou
Could not initialize class 
net.sf.jasperreports.engine.export.MatcherExportFilterMappingExtensionsRegistryFactory

Buscando pela web encontrei vários links sobre esse assunto, uso de fonte específica no jasper o que não era o meu caso, setar um valor num jasperreports.properties na pasta class entre outros.

Estava usando o jasperreports-4.1.1 enquanto que a versão atual é a 6.0.0. Olhei os fontes do jasper para ver se vinha uma luz, não tendo uma solução clara preferi atualizar o jar do jasper com a expectativa que o erro em relação ao sistema operacional já estivesse corrigido.

Como o projeto não usa Maven, atualizei manualmente e a cada teste dava um novo erro devido a falta de alguma dependência. Nunca senti tanta falta do Maven

Mas por fim fui gratificado com solução do problema.


domingo, 4 de janeiro de 2015

LIMIT do PostgreSQL != ROWNUM do Oracle

Numa aplicação de um cliente, Flex+Java+JDBC+PostgreSQL, estou ajudando a converter para usar Oracle.

Numa olhada rápida trocamos o comando LIMIT do PostgreSQL nas instruções sql para ROWNUM (no where) por acharmos serem equivalentes.

Na maioria das alterações funcionou corretamente pois tínhamos LIMIT 1, então trocando para WHERE ROWNUM = 1 se obteve o resultado esperado comparando o retorno da aplicação usando PostgreSQL e Oracle.

Mas em outros casos o resultado não foi o esperado, tipo LIMIT 10 trocando para ROWNUM = 10, retornava 1 registro ou nenhum enquanto que o PostgreSQL retornava até 10 registros.

Olhando a documentação dessas instruções se percebeu que não são equivalentes, o LIMIT "limita" a quantidade de registros retornados até o número informado, podendo retornar menos, enquanto que o ROWNUM é uma pseudo coluna que o Oracle "cria" para cada linha retornada, nesse caso ROWNUM = 10 irá retornar somente a linha 10 ou nenhuma caso o restante do WHERE retornasse menos de 10 linhas.

A solução foi fácil, ROWNUM <= 10. 

Veja também: