Bonfo
22-05-2007, 16:33
Non so quanti di voi usino queste tecnologie, ma ho un poblema e mi da fastidio no saperlo risolvere :D :D
Semplifichiamo le cose al massimo:
Ho un campo dell'oggetto che è un enumerativo. Utilizzando Hibernate lo riesco a mappare nel DB con intero con la semplice annotations @Enuemerated.
@Entity
public class MyObject
{
private MyEnum enum;
@Enumerated
public MyEnum getEnum()
{
return enum;
}
public void setEnum(MyEnum enum)
{
this.enum = enum;
}
}
public enum MyEnum
{
PRIMO,
SECONDO,
TERZO
}
Fin qua tutto bene... funziona correttamente.
Ora vorrei che l'oggetto venisse caricato da una form.
Quindi uso struts e creo la relativa action.
public class MyAction extends ActionSupport
{
private MyObjecft object;
public String execute() throws Exception
{
if(getObject() == null)
{
return INPUT;
}
//Salvo i dati nel DB utilizzando Hibernate
return SUCCESS;
}
public void setObject(MyObject object)
{
this.object= object;
}
public MyObject getObject()
{
return object;
}
// METODO PER OTTENERE LA LISTA DELLE OPZIONI
}
Ed infine nella mia jsp uso i tag di stuts per creare dei radio button per far scegliere all'utente il valore utilizzando il metodo misterioso, ovvero l'ultimo,per popolare la lista
<s:radio label="enumerativo" list="mysterymethod" name="object.enum"></s:radio>
Bene... veniamo ora al metodo misterioso.Il metodo misterioso deve ritornare una Map che permette a struts di popolare i radio-button e fornire i corretti valori all'applicazione al submit.
Se io uso questo:
public Map<MyEnum, String> getMyEnums()
{
Map<MyEnum, String> map = new HashMap<MyEnum, String>();
for(MyEnum enum: MyEnum.values())
{
map.put(enum,enum.name());
}
return map;
}
non funziona niente e mi viene detto
ParametersInterceptor - [setParameters]: Unexpected Exception catched: Error setting expression 'object.enum' with value '[Ljava.lang.String;@1d22ddb'
Se invece utilizzo gli interi, e quindi
public Map<Integer, String> getMyEnums()
{
Map<Integer, String> map = new HashMap<Integer, String>();
for(MyEnum enum: MyEnum.values())
{
map.put(enum.ordinal(),enum.name());
}
return map;
}
e modifico opprtunamente solo il getter e il setter dentro MyObject
public Integer getEnum()
{
return enum.ordinal();
}
public void setEnum(Integer enum)
{
this.enum = MyEnum.values()[enum];
}
tutto funziona.
Il bello è che se modifico in questo modo il setter
public Object getEnum()
{
return enum;
}
public void setEnum(Object enum)
{
System.out.println(enum.getClass().getCanonicalName());
}
il risultato è sempre java.lang.String
Evidentemente Struts fa il casting in automatico delgi interi, ma degli enum no.
C'è un metodo per riuscire a leggere direttamente il risultato della scelta come enumerativo??
Se la risposta è no, quale è il metodo più eleganete per continuare ad utilizzare nella applicazione gli enumerativi ( che garantiscono type-safe) e leggere attravero gli interi??
GARZIE GRAZIE :ave: :ave:
P.S.: spero di essere stato chiaroe di non avervi affto addormentare con la lunghezza del post
Semplifichiamo le cose al massimo:
Ho un campo dell'oggetto che è un enumerativo. Utilizzando Hibernate lo riesco a mappare nel DB con intero con la semplice annotations @Enuemerated.
@Entity
public class MyObject
{
private MyEnum enum;
@Enumerated
public MyEnum getEnum()
{
return enum;
}
public void setEnum(MyEnum enum)
{
this.enum = enum;
}
}
public enum MyEnum
{
PRIMO,
SECONDO,
TERZO
}
Fin qua tutto bene... funziona correttamente.
Ora vorrei che l'oggetto venisse caricato da una form.
Quindi uso struts e creo la relativa action.
public class MyAction extends ActionSupport
{
private MyObjecft object;
public String execute() throws Exception
{
if(getObject() == null)
{
return INPUT;
}
//Salvo i dati nel DB utilizzando Hibernate
return SUCCESS;
}
public void setObject(MyObject object)
{
this.object= object;
}
public MyObject getObject()
{
return object;
}
// METODO PER OTTENERE LA LISTA DELLE OPZIONI
}
Ed infine nella mia jsp uso i tag di stuts per creare dei radio button per far scegliere all'utente il valore utilizzando il metodo misterioso, ovvero l'ultimo,per popolare la lista
<s:radio label="enumerativo" list="mysterymethod" name="object.enum"></s:radio>
Bene... veniamo ora al metodo misterioso.Il metodo misterioso deve ritornare una Map che permette a struts di popolare i radio-button e fornire i corretti valori all'applicazione al submit.
Se io uso questo:
public Map<MyEnum, String> getMyEnums()
{
Map<MyEnum, String> map = new HashMap<MyEnum, String>();
for(MyEnum enum: MyEnum.values())
{
map.put(enum,enum.name());
}
return map;
}
non funziona niente e mi viene detto
ParametersInterceptor - [setParameters]: Unexpected Exception catched: Error setting expression 'object.enum' with value '[Ljava.lang.String;@1d22ddb'
Se invece utilizzo gli interi, e quindi
public Map<Integer, String> getMyEnums()
{
Map<Integer, String> map = new HashMap<Integer, String>();
for(MyEnum enum: MyEnum.values())
{
map.put(enum.ordinal(),enum.name());
}
return map;
}
e modifico opprtunamente solo il getter e il setter dentro MyObject
public Integer getEnum()
{
return enum.ordinal();
}
public void setEnum(Integer enum)
{
this.enum = MyEnum.values()[enum];
}
tutto funziona.
Il bello è che se modifico in questo modo il setter
public Object getEnum()
{
return enum;
}
public void setEnum(Object enum)
{
System.out.println(enum.getClass().getCanonicalName());
}
il risultato è sempre java.lang.String
Evidentemente Struts fa il casting in automatico delgi interi, ma degli enum no.
C'è un metodo per riuscire a leggere direttamente il risultato della scelta come enumerativo??
Se la risposta è no, quale è il metodo più eleganete per continuare ad utilizzare nella applicazione gli enumerativi ( che garantiscono type-safe) e leggere attravero gli interi??
GARZIE GRAZIE :ave: :ave:
P.S.: spero di essere stato chiaroe di non avervi affto addormentare con la lunghezza del post