Bonjour,

Je suis en train d'apprendre Struts 2, et j'ai essayé d'utiliser l'interface ModelDriven.

Je cherche à créer une page affichant le détail d'un enregistrement (Record) dont l'identifiant est passé comme paramètre de l'URL (recordId).

Voici le code source (simplifié) de mon action :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class DisplayRecordAction extends ActionSupport implements ModelDriven<Record> {
 
	private static final long serialVersionUID = 1L;
 
	private int recordId;
 
	private Record record;
 
	public int getRecordId() {
		return recordId;
	}
 
	public void setRecordId(int recordId) {
		this.recordId = recordId;
	}
 
	public String execute() {
		record = RecordService.getInstance().load(recordId);
		return SUCCESS;
	}
 
	@Override
	public Record getModel() {
		return record;
	}
}
Je pensais que Struts 2 allait appeler setRecordId, puis execute, puis getModel. Le code précédent aurait alors affiché le bon enregistrement. Mais ce n'est pas ce qui se passe : getModel est appelé AVANT setRecordId. Je ne peux pas charger le bon enregistrement avant même de connaitre son identifiant. getModel est ensuite appelé une deuxième fois, et lors de ce deuxième appel je renvoie l'enregistrement correct, mais c'est le record renvoyé lors du premier appel, c'est à dire null, qui est affiché.

J'ai deux hypothèses :
Hypothèse 1 : il y a un bogue dans Struts 2. Lors du premier appel à getModel, Struts 2 veut remplir les champs du modèle avec les valeurs provenant de la requête. Le deuxième appel à getModel sert à lire les valeurs depuis l'action pour afficher le formulaire. Le bogue serait que lors de l'affichage du formulaire, Struts 2 afficherait le modèle issu du premier appel plutôt que celui issu du deuxième.
Hypothèse 2 : je n'ai rien compris.

Je penche pour l'hypothèse 2.

Quelqu'un peut-il m'expliquer mon erreur?

Edit : j'ai oublié de le préciser, mais si je n'utilise pas ModelDriven, mon code fonctionne.