Ich arbeite an JSF-Projekt mit Spring und Hibernate, die unter anderem eine Reihe von Converter
s hat, die nach dem gleichen Muster:Implement Konvertern für Unternehmen mit Java Generics
getAsObject
die Darstellung String erhält von die Objekt-ID, wandelt es in eine Zahl, und die Entität der gegebenen Art holen und die gegebene IDgetAsString
empfängt und Einheit und gibt die ID des zuString
umgewandelt Objekt
Der Code ist im Wesentlichen, was folgt (Schecks weggelassen):
@ManagedBean(name="myConverter")
@SessionScoped
public class MyConverter implements Converter {
private MyService myService;
/* ... */
@Override
public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value) {
int id = Integer.parseInt(value);
return myService.getById(id);
}
@Override
public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value) {
return ((MyEntity)value).getId().toString();
}
}
die große Anzahl von Converter
s gegeben, die genau wie diese sind (mit Ausnahme der Art von MyService
und MyEntity
natürlich), war ich frage mich, ob es sich lohnt, einen einzigen generischen Konverter zu verwenden. Die Implementierung der generischen selbst ist nicht schwierig, aber ich bin mir nicht sicher über den richtigen Ansatz, um die Bohnen zu deklarieren.
Eine mögliche Lösung ist die folgende:
1 - die generische Implementierung schreiben, machen wir es MyGenericConverter
nennen, ohne Bean Anmerkung
2 - Schreiben Sie den spezifischen Konverter Anzeige eine Unterklasse von MyGenericConverter<T>
und mit Anmerkungen versehen als benötigt:
@ManagedBean(name="myFooConverter")
@SessionScoped
public class MyFooConverter implements MyGenericConverter<Foo> {
/* ... */
}
Während ich dies schreibe ich erkannte, dass vielleicht ein Allgemein nicht wirklich nötig ist, so vielleicht nur eine Basisklasse mit der Umsetzung der beiden Methoden schreiben, ich könnte ein d Unterklasse nach Bedarf.
Dort ein paar nicht triviale Details, die beachtet werden müssen (wie die Tatsache, dass ich die MyService
Klasse in irgendeiner Weise abstrahieren müsste), so ist meine erste Frage: ist es den Aufwand wert?
Und wenn ja, gibt es andere Ansätze?
Mit der „id“ Eigenschaft zu finden ist Nicht empfohlen in equals und hashCode-Methoden: Sie empfehlen die Implementierung von equals() und hashCode() mithilfe der Geschäftsschlüsselgleichheit: https://docs.jboss.org/hibernate/stable/core.old/reference/en/html/persistent-classes -equalshashcode.html Und was ist mit zusammengesetzten IDs? –