Problema enum iReport

27 respostas
R

Boa tarde!

Estou com um problema no meu relatório que é o seguinte: meu field no ireport esta do tipo string só que na minha aplicação ele é Enum, ai quando executa a aplicação da um erro:

Caused by: java.lang.ClassCastException:
br.com.mcinfo.rep.modelo.enumeracoes.EnumUnidadeFederativa cannot be
cast to java.lang.String

Como posso fazer para no ireport criar um tipo Enum.

27 Respostas

M

Cara vc precisa apontar para o pacote onde fica a classe enum ao invés de apontar para java.util.String. Eu acho, não tenho certeza, que enum esta no mesmo pacote so que se chama enumeration. java.util.enumeration.

Tenta ai e se der erro mande novamente.

R

matheus306:
Cara vc precisa apontar para o pacote onde fica a classe enum ao invés de apontar para java.util.String. Eu acho, não tenho certeza, que enum esta no mesmo pacote so que se chama enumeration. java.util.enumeration.

Tenta ai e se der erro mande novamente.

kra… não sei qual vesão do iReport que vc usa mas, a que eu estou usando não tem como apontar p/ o pacote do enumeration! Somente p/ os pacotes pre-definidos…

M

Quando vc declara um field ele te da aquelas opções, mas, aquelas não são as únicas. Você pode declarar um caminho ali. Ex: na versão 2.02 ele não lista java.util.list. Toda vez eu declaro na mão!

Veja lá!

R

matheus306:
Quando vc declara um field ele te da aquelas opções, mas, aquelas não são as únicas. Você pode declarar um caminho ali. Ex: na versão 2.02 ele não lista java.util.list. Toda vez eu declaro na mão!

Veja lá!

blz! ate da p/ declarar um campo com este pacote “java.util.Enumeration” mas… quando adiciono um “campo texto” p/ exibicao do valor, ele nao me deixa definir com este pacote! a nao ser que eu defina como “java.lang.Number”!? será que da certo?

M

segure o field e arrates para a sua tela. Repare que ele vai criar um campo do tipo string e vai colocar assim “”+$F{enum}

D

Desculpa gente, posso nunca ter visto esse caso, mas porque usaria List, Enum se os campos são para exibir geralmente um único valor?
Qual seria a real aplicação de um campo ter um objeto List?

Abraços

M

bom cara! na verdade, se eu entendi a sua pergunta, um campo nunca é do tipo list. Vc geralmente passa uma lista de objeto para o irport e declara os atributos dos objetos q contem na lista ex:
Classe pessoa.

public class Pessoa{
 protected Integer id;
 protected String nome;
 protected String rg;
 
 geter´s e seter´s
}

vc passa uma lista de pessoa e no ireport declara os campos de pessoa. Ex: Filed > String > nome. Assim se vc mandar 500 pessoas em uma lista, ele vai imprimir o nome 500 vezes.

Entendeu?

R

agora sim! deu certo eu criar o field do tipo Enumeration e o text field correspondente, porem… ao executar o relatorio eh exibida a seguinte msm de erro:

Error evaluating expression : Source text : “”+$F{corEtnia}
Caused by: java.lang.ClassCastException: br.com.faespsenar.sicp.model.TipoDeEtnia cannot be cast to java.util.Enumeration

Sendo que “TipoDeEtnia” eh uma classe enum! nao to entendeno o pq do erro!

M

Estranho mesmo!!!

vou dar uma pesquisada aki pra te resp. Mas, as vezes vc pode passar este campo como parametro no java. E passar o valor para String.

Teria como?

R

matheus306:
Estranho mesmo!!!

vou dar uma pesquisada aki pra te resp. Mas, as vezes vc pode passar este campo como parametro no java. E passar o valor para String.

Teria como?

intao… eu fiz uma gambiarra aqui q deu certo! eu criei um atributo @transient que captura este valor do enum(a string) e exibi no relatorio. mas nao queria deixar deste jeito! acho q ha uma maneira mais elegate de c resolver este problema!?

M

hehehehe… Gambiarra mermo!! kkkkkkkkkk…
acho que sim…

vc tem algum método público no enum que retorne o valor?

R

matheus306:
hehehehe… Gambiarra mermo!! kkkkkkkkkk…
acho que sim…

vc tem algum método público no enum que retorne o valor?

tenho nao! precisa ser criado?
mas como seria este metodo? nunca ouvi falar de um metodo dentro de uma classe enum, que retornasse o valor!

M

estava olhando aqui um relatório que eu fiz que usa enum, so que, eu passo um único objeto, como se fosse a ficha de uma única pessoa, então eu passo como parametro e recebo uma string no ireport. No seu caso vc passa uma lista com vários registros ne?

M

la vai um ex:

public enum NivelHierarquicoEnum {
	
	LULA ("Presidente"),
	AECIO ("Governador"),


	private String descricao;
	
	NivelHierarquicoUGEnum(String descricao){
		this.descricao = descricao;
	}

	@Override
	public String toString() {
		return descricao;
	}
	
	public String getName(){
		return name();
	}
	
}
M

outra coisa, ao inves de apontar para enumeration, como eu tinha te falado antes, coloca o field para apontar para a sua classe enum.

depois troca o field la na tela de “”+${filed} para ${filed}.getDescricao()

R

isso! na verdade eh um relatorio de projetos, onde um projeto existe varios participantes! entao eu criei um relatorio com um subrelatorio(p/ exibicao dos registros dos participantes) onde passo como parametro uma lista de participantes. Eh na bean participante que tem a enum!

mas blz, vlw pelo auxilio! na verdade esse problema com os enum eh o menor problema que tenho! Surgiu um outro que estou descabelano aqui viu… rsrsrrs

um participante pode ser: produtor rural, trabalhador rural e familiar, blz? como eu filtraria esta informacao antes da exibicao do relatorio? pq p/ kda tipo de participante eh uma informacao especifica que tenho que exibir! Entao terei que criar 3 tipos de relatorios, certo? mas ficaria dificil o filtro pq eu exibo as informacoes do participante dentro de um subrelatorio! entendeu meu caso?

vlw.

M

no seu caso vc teria que criar subs. Se eu entendi vc tem tres tipos de pessoas, cada uma tem um tipo de relatorio. Então vc cria três subs. Formata os campos e no java vc passa os parametros pra cada hum e junta os tres em um quarto que seria tipo o relatorio pai.

entendeu?

R

matheus306:
no seu caso vc teria que criar subs. Se eu entendi vc tem tres tipos de pessoas, cada uma tem um tipo de relatorio. Então vc cria três subs. Formata os campos e no java vc passa os parametros pra cada hum e junta os tres em um quarto que seria tipo o relatorio pai.

entendeu?

saquei! soh nao entendi a parte do quarto que seria o relatorio pai… como faria?

M

declara tres subs nele. ele so serve pra receber sub! passa os tres subs como parametro pra ele.

entendeu?

R

matheus306:
declara tres subs nele. ele so serve pra receber sub! passa os tres subs como parametro pra ele.

entendeu?

ah tah… entendi! mas eu ja resolvi aqui com meu gerente… achamos uma maneira de simplificar este problema rsrrs, uma gambiarrinha como sempre!
mas… voltano a aquele assundo do enum, nao entendi o objetivo da declaracao dete metodo em sua classe de exemplo:

NivelHierarquicoUGEnum(String descricao){ this.descricao = descricao; }

M

isto ai vc pode tirar! serve para alterar o valor. mas é muito raro ocorrer.

R
matheus306:
isto ai vc pode tirar! serve para alterar o valor. mas é muito raro ocorrer.

ah tah! soh nao entendi direto como ficaria no meu caso, pois sua classe enum eh meio diferente!

da uma olhada como defini a minha:

package br.com.faespsenar.sicp.model;

public enum TipoDeParticipante {
	PRODUTOR, TRABALHADOR, FAMILIAR_DO_PRODUTOR, FAMILIAR_DO_TRABALHADOR;
}
M
1. package br.com.faespsenar.sicp.model;  
   2.   
   3. public enum TipoDeParticipante {  
   4.     PRODUTOR("produtor").....
   5. }

o que vai dentro do parentese e a string descrição que vc declarou

D

Pessoal, me desculpe a entrada nesse assunto, mas pelo que percebi, e já havia concluido antes, não é necessário fazer o que estão propondo.
Estão coçando a orelha esquerda com a mão direita sem necessidade.
Os parâmetros podem passar objetos de diversos tipos, mas se for passar um list apenas para exibir uma informação, esqueça.
Acho que, para o que precisam, estão querendo usar o JRBeanCollectionDataSource, onde transmitimos um List, ArrayList e por ai vai.
Uso este objeto quando estou trabalhando com Spring e JPA ou Hibernate.
Você monta o relatório sem conexão e depois transmite as informações alimentando os Fields criados.
Pesquisem que com certeza irão aprender sobre isso e, se não quiserem perder tempo pesquisando, compre um livro, como eu fiz.
Abraços

R

djemacao:
Pessoal, me desculpe a entrada nesse assunto, mas pelo que percebi, e já havia concluido antes, não é necessário fazer o que estão propondo.
Estão coçando a orelha esquerda com a mão direita sem necessidade.
Os parâmetros podem passar objetos de diversos tipos, mas se for passar um list apenas para exibir uma informação, esqueça.
Acho que, para o que precisam, estão querendo usar o JRBeanCollectionDataSource, onde transmitimos um List, ArrayList e por ai vai.
Uso este objeto quando estou trabalhando com Spring e JPA ou Hibernate.
Você monta o relatório sem conexão e depois transmite as informações alimentando os Fields criados.
Pesquisem que com certeza irão aprender sobre isso e, se não quiserem perder tempo pesquisando, compre um livro, como eu fiz.
Abraços

pois eh… to usando o JRBeanArrayDataSource, para um objeto do tipo List! Funcionou em um relatorio que tinha feito a algum tempo, porem, quando executo esse novo nao está sendo exibido! Parece que esta em um loop infinito! Ja debuguei o codico e esta tudo correto. O problema esta na hora da geracao, quando estao sendo executadas as consultas!
Vo tentar usar esta nova Classe que mencionou p/ ver funciona…

vlw

R
matheus306:
1. package br.com.faespsenar.sicp.model;  
   2.   
   3. public enum TipoDeParticipante {  
   4.     PRODUTOR("produtor").....
   5. }
o que vai dentro do parentese e a string descrição que vc declarou

eai kra, blz?
Veja c vc consegue me dizer oq pode estar aconteceno...

Antes da exibicao do relatorio, eu verifico os tipos de particpantes e os separo em 3 Collections kda, certo?
No meu relatorio principal eu criei 3 subrelatorios(um p/ kda tipo de participante), onde eu passo as respectivas Collections. Até ai blz... porem, quando mando exibir o bendito relatório nao acontece nada, somente uns barulhos estranhos no HD! Eh como se estivesse em loop infinito! Ja debuguei o codico e esta tudo correto. O problema esta na hora da geracao, quando estao sendo executadas as consultas, talvez!
Aí, depois de muito tempo eh exibida a seguinte msm de erro:

25/09/2008 11:30:29 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet vraptor2 threw exception java.lang.OutOfMemoryError: Java heap space 25/09/2008 11:30:33 org.apache.catalina.connector.CoyoteAdapter service SEVERE: An exception or error occurred in the container during the request processing java.lang.OutOfMemoryError: Java heap space

oq pode estar aconteceno? c puder me ajudar novamente...

Obrigado.

F

rodrigo.fai:
matheus306:
hehehehe… Gambiarra mermo!! kkkkkkkkkk…
acho que sim…

vc tem algum método público no enum que retorne o valor?

tenho nao! precisa ser criado?
mas como seria este metodo? nunca ouvi falar de um metodo dentro de uma classe enum, que retornasse o valor!


faça este método público e use-o como se fosse uma classe ao acessar. simples, preste bastante atenção na sua sintaxe.

Criado 23 de setembro de 2008
Ultima resposta 25 de set. de 2008
Respostas 27
Participantes 4