Sto lavorando su progetto JSF con la Primavera e Hibernate che tra l'altro ha un certo numero di Converter
s che seguono lo stesso schema:Implementare convertitori per gli enti con Java Generics
getAsObject
riceve la rappresentazione di stringa di l'oggetto id, lo converte in un numero, e recuperare l'entità del dato genere e l'id propostagetAsString
riceve ed entità e restituisce l'id dell'oggetto convertitoString
Il codice è essenzialmente quanto segue (controlli omessi):
@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();
}
}
dato il gran numero di Converter
s che sono esattamente simili (ad eccezione del tipo di MyService
e MyEntity
ovviamente), ero chiedendo se valesse la pena usare un singolo convertitore generico. L'implementazione del generico di per sé non è difficile, ma non sono sicuro dell'approccio giusto per dichiarare i bean.
Una possibile soluzione è la seguente:
1 - Scrivere l'implementazione generica, chiamiamolo MyGenericConverter
, senza alcuna annotazione Bean
2 - Scrivere la specifica annuncio convertitore una sottoclasse di MyGenericConverter<T>
e annotare come necessario:
@ManagedBean(name="myFooConverter")
@SessionScoped
public class MyFooConverter implements MyGenericConverter<Foo> {
/* ... */
}
Mentre scrivevo questo mi sono reso conto che forse un generico non è realmente necessario, quindi forse si potrebbe semplicemente scrivere una classe base con l'attuazione dei due metodi, uno d sottoclasse secondo necessità.
Ci sono alcuni dettagli non banali che devono essere risolti (come il fatto che dovrei astrarre la classe MyService
in qualche modo) quindi la mia prima domanda è: vale la pena?
E se sì, ci sono altri approcci?
utilizzando la proprietà "id" è non consigliato nei metodi equals e hashCode: si consiglia l'implementazione di equals() e hashCode() utilizzando l'uguaglianza della chiave Business: https://docs.jboss.org/hibernate/stable/core.old/reference/en/html/persistent-classes -equalshashcode.html E per quanto riguarda gli ID compositi? –