Hi!
In your first code example you are binding the property model to your
config map, using a string key for lookup (“VALUE1”).
Since generics in java is mostly syntactic sugar, I think the PropertyModel
reads & writes from your config map using a String key.
This is why hibernate complains: the map contains a String key instead of
an Enum.
We use a specialized MapKeyModel in our apps for this:
---
import java.util.Map;
import org.apache.wicket.model.IModel;
public class MapKeyModel<K, V> implements IModel<V>
{
private final IModel<Map<K, V>> mapModel;
private final K key;
public static <K, V> MapKeyModel<K, V> of( IModel<Map<K, V>> mapModel,
K key )
{
return new MapKeyModel<K, V>( mapModel, key );
}
public MapKeyModel( IModel<Map<K, V>> mapModel, K key )
{
this.mapModel = mapModel;
this.key = key;
}
@Override
public V getObject()
{
Map<K, V> map = mapModel.getObject();
return map.get( key );
}
@Override
public void setObject( V object )
{
Map<K, V> map = mapModel.getObject();
map.put( key, object );
}
@Override
public void detach()
{
mapModel.detach();
}
}
---
Met vriendelijke groet,
Kind regards,
Bas Gooren
Op 4 februari 2019 bij 13:51:28, Zbynek Vavros ([email protected])
schreef:
I got this class that has map with enums as keys:
public class MasterClass {
private Map<MyEnum, String> config = Maps.newHashMap();
}
enum is classic:
public enum MyEnum {
VALUE1,
VALUE2
}
now I would like to use one entry of this map as a model for TextField:
new RequiredTextField<>("componentId", new
PropertyModel<>(modelObject.getConfig(), "VALUE1")))
but when saved to DB Hibernate says the key is String and Enum is expected:
java.lang.ClassCastException: java.lang.String cannot be cast to
java.lang.Enum
Using ChainingModel or
Model.of(modelObject.getConfig().get(MyEnum.VALUE1))) causes the value not
to be bind at all.
I know I can use "side" property and fill this map manually in onSubmit
just before saving to DB but would like to avoid that.
Thanks