Caused by: java.lang.NoSuchMethodException: Unknown property 'pf' on class 'class br.com.cadastrobeneficios.domain.Beneficio'

Boa noite…

Vamos lá, para começar sou novo em java e estou a 3 dias em um erro que já tentei foruns, pesquisei, vi a documentação e nada vi sobre esse erro retornado pelo jasper quando adicionei mais 2 campos no relatório(pf, childnumber), no preview está tudo ok… porém quando rodo a aplicação e acesso o relatório ele me retorna a exception abaixo. Uso Jasper Reports com eclipse e ao gerar o relatório sobre atividades de inscritos nos benefícios ele me retorna esse erro Caused by: java.lang.NoSuchMethodException: Unknown property ‘pf’ on class ‘class br.com.cadastrobeneficios.domain.Beneficio’ o relatório rodava redondo assim como os outros rodam… porém após acrescentar duas propriedades ele deixou de rodar… segue exception, domain e report… aguardo ajuda… muito obg.

EXCEPTION:

net.sf.jasperreports.engine.JRException: Error retrieving field value from bean : pf
at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:123)
at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getFieldValue(JRAbstractBeanDataSource.java:96)
at net.sf.jasperreports.engine.data.JRBeanCollectionDataSource.getFieldValue(JRBeanCollectionDataSource.java:109)
at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:1358)
at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1259)
at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1235)
at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1614)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:150)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:963)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:892)
at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:114)
at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:668)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:984)
at br.com.cadastrobeneficios.relatorio.Relatorio.getRelatorioAtividade(Relatorio.java:120)
at br.com.cadastrobeneficios.bean.BeneficioBean.geraRelatorioInscritoPorAtividade(BeneficioBean.java:209)…
Caused by: java.lang.NoSuchMethodException: Unknown property ‘pf’ on class ‘class br.com.cadastrobeneficios.domain.Beneficio’
at org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(PropertyUtilsBean.java:1313)
at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:762)
at org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:837)
at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:426)
at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:111)
… 51 more

MÉTODO QUE GERA RELATÓRIO:

public void getRelatorioAtividade(List lista) {
stream = this.getClass().getResourceAsStream("/reports/atividade.jasper");
Map<String, Object> params = new HashMap<String, Object>();
baos = new ByteArrayOutputStream();

	try {
		JasperReport report = (JasperReport) JRLoader.loadObject(stream);
		JasperPrint print = JasperFillManager.fillReport(report, params,
				new JRBeanCollectionDataSource(lista, false));
		JasperExportManager.exportReportToPdfStream(print, baos);

		response.reset();
		response.setContentType("application/pdf");
		response.setContentLengthLong(baos.size());
		response.setHeader("Content-disposition", "inline: filename=relatorio.pdf");
		response.getOutputStream().write(baos.toByteArray());
		response.getOutputStream().flush();
		response.getOutputStream().close();

		context.responseComplete();
	} catch (JRException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

QUERY BENEFICIO.LISTARPORATIVIDADE preenche a lista que é passada para gerar o relatório.

@Entity
@Table(name = “beneficio”)
@NamedQueries({ @NamedQuery(name = “Beneficio.listarPorAtividade”, query = “SELECT b FROM Beneficio b JOIN b.atividade a JOIN b.inscrito i WHERE a.nome = :nome AND b.dataInicio BETWEEN :dataInicio AND :dataFim”) })

public class Beneficio {
@Id
@Column(name = “codigo”)
@GeneratedValue(strategy = GenerationType.AUTO)
private Long codigo;

@Column(name = "data_inicio", nullable = false)
@Temporal(value = TemporalType.TIMESTAMP)
private Date dataInicio;

…continua código…

MODELS BENEFICIO E INSCRITO

@Entity

@Table(name = “beneficio”)

@NamedQueries({ @NamedQuery(name = “Beneficio.listar”, query = “SELECT beneficio FROM Beneficio beneficio”),
@NamedQuery(name = “Beneficio.buscarPorCodigo”, query = “SELECT beneficio FROM Beneficio beneficio WHERE beneficio.codigo = :codigo”),
@NamedQuery(name = “Beneficio.listarPorInscrito”, query = “SELECT b FROM Beneficio b JOIN b.atividade a JOIN b.inscrito i WHERE i.nome = :nome AND b.dataInicio BETWEEN :dataInicio AND :dataFim”),
@NamedQuery(name = “Beneficio.listarPorAtividade”, query = “SELECT b FROM Beneficio b JOIN b.atividade a JOIN b.inscrito i WHERE a.nome = :nome AND b.dataInicio BETWEEN :dataInicio AND :dataFim”) })

public class Beneficio {
@Id
@Column(name = “codigo”)
@GeneratedValue(strategy = GenerationType.AUTO)
private Long codigo;

@Column(name = "data_inicio", nullable = false)
@Temporal(value = TemporalType.TIMESTAMP)
private Date dataInicio;

@Column(name = "data_fim")
@Temporal(value = TemporalType.TIMESTAMP)
private Date dataFim;

@Column(name = "dia_semana", nullable = false)
private String diaDaSemana;

@Column(name = "horario_inicio", length = 50, nullable = false)
private String horarioInicio;

@Column(name = "horario_fim", length = 50, nullable = false)
private String horarioFim;

@NotEmpty(message = "O campo Responsável Preenchimento é obrigatório.")
@Column(name = "respreenchimento", length = 50, nullable = false)
private String responsavelPreenchimento;

@NotNull(message = "O campo Atividade é obrigatório.")
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "atividade_codigo", referencedColumnName = "codigo", nullable = false)
private Atividade atividade;

@NotNull(message = "O campo Nome é obrigatório.")
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "inscrito_codigo", referencedColumnName = "codigo", nullable = false)
private Inscrito inscrito;
@Entity

@Table(name = “inscrito”)

@NamedQueries({
@NamedQuery(name = “Inscrito.listar”, query = “SELECT inscrito FROM Inscrito inscrito ORDER BY inscrito.nome ASC”),
@NamedQuery(name = “Inscrito.listarPorDataNiver”, query = “SELECT inscrito FROM Inscrito inscrito WHERE inscrito.nascimento LIKE ?”),
@NamedQuery(name = “Inscrito.buscarPorCodigo”, query = “SELECT inscrito FROM Inscrito inscrito WHERE inscrito.codigo = :codigo”),
@NamedQuery(name = “Inscrito.existeNome”, query = “SELECT inscrito FROM Inscrito inscrito WHERE inscrito.nome = ?”) })

public class Inscrito {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "codigo")
private Long codigo;

@NotEmpty(message = "O campo criança inscrita é obrigatório.")
@Size(min = 5, max = 50, message = "Tamanho inválido para o campo Criança Inscrita(5 - 50 dígitos)")
@Column(name = "crianca_inscrita", length = 50, nullable = false)
private String criancaInscrita;

@NotEmpty(message = "O campo Nome Completo é obrigatório.")
@Size(min = 5, max = 50, message = "Tamanho inválido para o campo nome (5 - 50 dígitos)")
@Column(name = "nome", length = 50, nullable = false, unique = true)
private String nome;

@NotEmpty(message = "O campo Data de Nascimento é Obrigatório.")
@Size(min = 10, max = 10, message = "Tamanh inválido para o campo data de nascimento (10 dígitos)")
@Column(name = "nascimento", nullable = false)
private String nascimento;

@NotEmpty(message = "O campo Sexo é obrigatório.")
@Column(name = "sexo", nullable = false)
private String sexo;

@Column(name = "childnumber")
private Integer childNumber;

@Column(name = "pf")
private Integer pf;

@Column(name = "cs")
private Integer cs;

@Column(name = "nis")
private String nis;

@NotEmpty(message = "O campo Registro/RG é obrigatório.")
@Size(min = 3, max = 13, message = "Tamanho inválido para o campo Registro/RG (3 - 13 dígitos.")
@Column(name = "registrorg", length = 13, nullable = false)
private String registroRg;

@NotEmpty(message = "O campo Endereço é obrigatório.")
@Column(name = "endereco", length = 50, nullable = false)
private String endereco;

@Column(name = "fone", length = 15)
private String fone;

@Column(name = "celular", length = 15)
private String celular;

@Column(name = "celular2", length = 15)
private String celular2;

@Column(name = "escola", length = 50)
private String escola;

@Column(name = "serie", length = 50)
private String serie;

@Column(name = "horario", length = 50)
private String horario;

@Column(name = "responsavel", length = 50, nullable = false)
private String responsavel;

@NotEmpty(message = "O campo Parentesco é obrigatório.")
@Column(name = "parentesco", length = 50, nullable = false)
private String parentesco;

@Column(name = "docresponsavel", length = 13, nullable = false)
private String documentoResponsavel;

@NotEmpty(message = "O campo Responsável Preenchimento é obrigatório.")
@Column(name = "respreenchimento", length = 50, nullable = false)
private String responsavelPreenchimento;
OBS: aguardo retorno ancioso....

Primeiro, cadê o método geraRelatoriosInscritoPorAtividade?

Segundo, no seu modelo quem tem o campo ‘pf’ é sua tabela de inscrito e se você ler a causa da exceção na stack trace em algum lugar você pediu pra procurar esse campo dentro de classe br.com.cadastrobeneficios.domain.Beneficio, logo o erro de NoSuchMethodException com a mensagem.

1- Boa noite adriano_si obg pela ajuda de pronto… segue o metodo geraRelatorioInscritoPorAtividade:.

2- Adriano o join que fiz já não traz todos os campos das 3 tabelas para serem usados na geração da lista?

public void geraRelatorioInscritoPorAtividade() {

Relatorio relatorio = new Relatorio();
BeneficioDAO beneficioDAO = new BeneficioDAO();
lista = beneficioDAO.listarPorAtividade(getNome(), getDataInicio(), getDataFim());

	if (!lista.isEmpty()) {
		relatorio.getRelatorioAtividade(lista);
	} else {
		FacesUtil.adicionarMensagemInfo("Não há informações para gerar o relatório.");
	}
}

Manda o código desse cara aqui agora…

ta na mão adriano-si

public List listarPorAtividade(String nome, Date dataInicio, Date dataFim) {
Session sessao = HibernateUtil.getSessionFactory().openSession();
List beneficios = new ArrayList<>();

	try {
		Query consulta = sessao.getNamedQuery("Beneficio.listarPorAtividade");
		consulta.setString("nome", nome);
		consulta.setDate("dataInicio", dataInicio);
		consulta.setDate("dataFim", dataFim);
		beneficios = consulta.list();

	} catch (RuntimeException ex) {
		throw ex;
	} finally {
		sessao.close();
	}

	return beneficios;
}

O DAO está correto. Cole aqui os models, sua classe Beneficio e Inscrito apenas… Completas. Na verdade, edite o post original e coloque todo esse código lá. :wink:

ok agora mesmo… pronto adriano_si tudo citado acima… só ressaltando tudo funfava 100% acrescentei essas duas propriedades pf e childnumber de inscritos e começou a dar essa exception e no preview ta funfando perfeito.

Que linha é essa exatamente?

é a linha da classe que gera o relatório e nela passa a lista para o JRBeanCollectionDataSource.

Certo, e dentro do teu relatório como estás recuperando o teu campo ‘pf’ ???

Dessa maneira:

dentro%20relat%C3%B3rio

como disse no preview ta funfando…

Mas calma man, você está usando um select interno e fazendo o select no código?

É isso, seu preview funciona, porque sem o código seu jasper vai executar esse select que está aí. Já em tempo de execução do seu código, você passa para o jasper a sua lista que buscou do DAO e sua lista é uma List< Beneficio >.

Dentro do relatório provavelmente você usa o seu campo pf como $F{pf}. Como seu JRCollenctionDataSource passou um List< Beneficio > o seu report tentar pegar o campo pf a partir do Bean Beneficio e tudo quebra…

Retire o select interno e ao usar os campos de seus beans se preocupe em onde eles estão, aí no caso o seu campo pf está em beneficio.inscrito.pf.

adriano _si o que você chama de select interno seria o que está sendo gerado pelo meu dataset e deixar o que está sendo feito pelo model Beneficio para ser passado para o JRBeanCollectionDataSource correto?
Ainda é um pouco vago na minha cabeça… muita coisa complicada… hehehehe

Basicamente é isso. A origem dos seus dados tem que ser uma só. Se você faz o select no Jasper, não precisaria fazer na aplicação, bastaria mandar os parâmetros e em tempo de execução recuperar do seu dataset do jasper os valores do banco. Isso ainda é uma opção.

Agora já que você está fazendo tudo pelo código usando a JPA, tem que ajustar seus FIELDS do relatório para refletir o modelo do Collection que você vai passar. Porque no relatório se você usa o campo fazendo $F{pf} o seu relatório vai buscar o campo pf na raiz do seu Collection que no caso é do tipo Beneficio, gerando assim a exception que causou tudo isso.

Só não te ajudo com mais detalhes, porque faz mais de anos que não mexo com IReport e Jasper, então não sei detalhes da geração, mas acho que tens que receber esse datasource como parâmetro no relatório. Vê se só refletindo teu modelo e retirando o dataset o teu problema já resolve ou pelo menos a mensagem de erro muda. :wink:

Se não, vai botando o novo erro aí e vamos dando um jeito

Ok… agora tenho um norte para começar as pesquisas novamente… adriano_si vou fazer as mudanças e volto a postar aqui para compartilhar com você… mas muito obg até aqui e volto se não der blz… vlw… Boa noite e bom descanso.