Entra

View Full Version : [JAVA+STRUTS2+HIBERNATE] Enumerativi


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