ça marche dans IReport Designer mais pas dans mon code

nasix
ça marche dans IReport Designer mais pas dans mon code

Bonjour,

Je souhaite créer un template via IReport Designer pour éditer les factures en PDF (une facture par page). J'utilise pour ce faire une datasource de type JavaBeans set Datasource.

Dans mes factures, je dois afficher les éléments ordinaire des factures (date, client, référence, ...) et une liste d'élément (que je nomme "examens", les examens sont les services que je facture). Pour afficher ces éléments dans le template j'utilise le composant List (de la librairie IReport) avec une dataset interne (ou imbriquée - nestaed Dataset), voici un aperçu de ma classe (JavaBean) Facture:

public class FactureTemplateBean {

private String nomPatient, codePatient, dateFacturation, prescripteur, payeur, medecin, referenceDemande, referenceFacture, montantLetter; private float totalAPaye;

private int coefP;

private JRBeanCollectionDataSource examens;

...

}

Comme vous pouvez le remarquer, examens est une JR Collection, composée d'objets de la classe ExamenBean, dont voici un aperçu:

public class ExamenBean {
private String code, nom;
...
}

Dans mon template, le dataset interne est bien configuré, et son expression est fixée à la valeur $F{examens}. Le mode Preview donne de bons résultats (le bon fichier PDF).

Le problème se pose quand je souhaite exploiter mon template dans un code JAVA:

List<FactureTemplateBean> liste = new ArrayList<FactureTemplateBean>();

liste.add(...);

liste.add(...);

....

JasperDesign jasperDesign = JRXmlLoader.load(templateName);

JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);

JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, new JRBeanCollectionDataSource(liste));

return JasperExportManager.exportReportToPdf(jasperPrint);

Quand j'exécute mon code, j'ai une exception m'informant que l'attribut "nom" (propriété de la classe ExamenBean) est inconnu:

net.sf.jasperreports.engine.JRRuntimeException: net.sf.jasperreports.engine.JRException: Error retrieving field value from bean : nom

.......

Caused by: java.lang.NoSuchMethodException: Unknown property 'nom'

Une fois que je supprime le composant List et le dataset interne, mon programme tourne sans problème.

Aurriez vous svp des suggestions pour moi.

Merci d'avance.

fredericmazue
Re: ça marche dans IReport Designer mais pas dans mon code

Bonjour Nasix,

Ca faisait longtemps...

Deux suggestions

nom est private. Il faudrait peut-être qu'il soit déclaré public ?

Ou bien peut-être que la librairie que tu utilises veut un getter dans ton Bean ?

string getNom();

Je pencherai pour la deuxième vu le message d"erreur : Error retrieving field value from bean : nom

nasix
Re: ça marche dans IReport Designer mais pas dans mon code

Bonjour Frederic,

Oui, ça fait longtemps, mais je suis toujours là.

Je ne pense pas que ça soit le problème, ma classe est une bonne classe Javabean, elle contient un constructeur par défaut, les attributs privés avec les getters et les setters, je n'ai montré dans mon post qu'un aperçu, la voici en version complète:

public class ExamenBean {

	private String code, nom;

	public void setNom(String nom) {
		this.nom = nom;
	}

	public String getNom() {
		return nom;
	}

	public void setCode(String code) {
		this.code = code;
	}

	public String getCode() {
		return code;
	}

	public ExamenBean() {
		super();
	}

	public ExamenBean(String code, String nom) {
		super();
		this.code = code;
		this.nom = nom;
	}
	
	public static JRBeanCollectionDataSource examensFactory(){
		
		List<ExamenBean> liste = new ArrayList<ExamenBean>();

		for(int i=0; i<3; i++){
			liste.add(new ExamenBean("FCV", "Frottis .."));
		}
		
		return new JRBeanCollectionDataSource(liste);
	}
}

Ce qui m'embête c'est que ça marche bien avec IReport Designer (Le mode preview arrive à récupérer l'attribut nom), donc je pense qu'il n'y a pas de souci avec la classe.

nasix
Re: ça marche dans IReport Designer mais pas dans mon code

J'ai trouvé.

J'ai fait une grosse connerie: dans ma collection de type JRBeanCollectionDataSource je ne mettais pas des objets de type ExamenBean mais d'une autre classe ExamenBeanForm (qui ne dispose pas de l'attribut nom).

C'est peut être l'un des inconvénients d'utiliser une collection non générique telle que IRBeanCollectionDataSource, mais dans mon cas, je n'ai pas le choix.

Merci beaucoup et désolé de vous avoir dérangé pour rien.

A bientôt.

fredericmazue
Re: ça marche dans IReport Designer mais pas dans mon code

Il n'y a pas de dérangement
C'est avec plaisir au contraire :)