Étant nouveau dans le monde de l'injection de dépendance, je m'essaie à Guice.

J'ai déclaré les interfaces et classes suivantes :

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
27
28
29
30
31
32
33
public interface Model<PK> {
  public PK getId();
  public void setId (PK id);
}
 
@ImplementedBy(BookImpl.class)
public interface Book extends Model<Integer> {
  public String getTitle();
  public void setTitle(String title);
}
 
public abstract class AbstractModel<PK> implements Model<PK> {
  private PK id;
  @Getter(property = "id") public PK getId () {
    return this.id;
  }
  @Setter(property = "id") public void setId (PK id) {
    this.id = id;
  }
  protected void firePropertyChange (String property, Object oldValue, Object newValue) {
    ...
  }
}
 
public class BookImpl extends AbstractModel<Integer> implements Book {
  private String title;
  @Getter(property = "title") public String getTitle () {
    return this.title;
  }
  @Setter(property = "title") public void setTitle (String title) {
    this.id = id;
  }
}
Pour chaque propriété de chaque objet Model, le setter doit en fait être une méthode assez volumineuse d'une quinzaine de lignes. Écrire cela 200 fois (c'est une approximation, mais l'ordre de grandeur est réel) est donc extrêmement pénible sans compter que je dois utiliser des méthodes spéciales en fonction du nom de la propriété. J'ai donc décidé de la réduire à une seule ligne et d'ajouter une annotation (simple, héritée, limitée aux méthodes) précisant la propriété modifiée, et d'ensuite traiter l'ensemble de mes setters dans un proxy, appelé Interceptor dans le langage de Guice.

Jusque là, pas de souci. Mais le problème est qu'en fin de méthode setter, je voudrais appeler la méthode firePropertyChange de l'AbstractModel. Et elle n'est pas trouvée.

En enquêtant un peu plus, j'ai vu que l'objet passé à l'intercepteur n'est pas l'implémentation, mais une sous-classe créée par Guice. Voici donc mes questions :
  • Donc, comment faire pour avoir cet objet BookImpl et pouvoir l'utiliser ?
  • Est-ce cela le bug reporté ici et ici ?
  • Si ce n'est pas le cas, je crée un nouveau ticket ?


D'avance merci,

Olivier