jsf - SelectManyBox - Enum Not saving -
i still have problem selectmanycheckbox..
selectmanycheckbox:
<p:selectmanycheckbox converter="genericenumconverter" value="#{aview.newobject.avalue}"> <f:selectitems value="#{enumbean.avaluevalues}" var="s" itemvalue="#{s}" itemlabel = "#{s.name}"/> </p:selectmanycheckbox>
converter selectmanycheckbox same described here: use enum in h:selectmanycheckbox
@facesconverter("genericenumconverter") public class genericenumconverter implements converter { private static final string attribute_enum_type = "genericenumconverter.enumtype"; @override public string getasstring(facescontext context, uicomponent component, object value) { system.out.println("getasstring 1: "); if (value instanceof enum) { system.out.println("getasstring 2: "); component.getattributes().put(attribute_enum_type, value.getclass()); system.out.println("getasstring 3: "); return ((enum<?>) value).name(); } else { system.out.println("getasstring 4: "); throw new converterexception(new facesmessage("value not enum: " + value.getclass())); } } @override @suppresswarnings({"rawtypes", "unchecked"}) public object getasobject(facescontext context, uicomponent component, string value) { system.out.println("getasobject 1: "); class<enum> enumtype = (class<enum>) component.getattributes().get(attribute_enum_type); system.out.println("getasobject 2: "); try { system.out.println("getasobject 3: "); return enum.valueof(enumtype, value); } catch (illegalargumentexception e) { system.out.println("getasobject 4: "); throw new converterexception(new facesmessage("value not enum of type: " + enumtype)); } }
the enum is:
public enum avalue { 1value, 2value, 3value, 4value; private final string name; private avalue() { system.out.println("avalue 1"); this.name = null; system.out.println("avalue 2"); } public string getname() { system.out.println("getname 1 " + name()); return resourcebundleutil.getlabelfromrb("avalue." + name()); } } public avalue[] getavaluevalues() { return avalue.values(); }
tomcat logs are:
avalue 1 avalue 2 avalue 1 avalue 2 avalue 1 avalue 2 avalue 1 avalue 2 avalue 1 avalue 2 avalue 1 avalue 2 avalue 1 avalue 2 avalue 1 avalue 2 avalue 1 avalue 2 getname 1value getname 2value getname 3value getname 4value getasstring 1: getasstring 2: getasstring 3: getasstring 1: getasstring 2: getasstring 3: getasstring 1: getasstring 2: getasstring 3: getasstring 1: getasstring 2: getasstring 3: getasstring 1: getasstring 2: getasstring 3: getasstring 1: getasstring 2: getasstring 3: getasstring 1: getasstring 2: getasstring 3: getasstring 1: getasstring 2: getasstring 3: getasstring 1: getasstring 2: getasstring 3: getname 1value getname 2value getname 3value getname 4value getasstring 1: getasstring 2: getasstring 3: getasstring 1: getasstring 2: getasstring 3: getasstring 1: getasstring 2: getasstring 3: getasstring 1: getasstring 2: getasstring 3: getasstring 1: getasstring 2: getasstring 3: getasstring 1: getasstring 2: getasstring 3: getasstring 1: getasstring 2: getasstring 3: getasstring 1: getasstring 2: getasstring 3: getasstring 1: getasstring 2: getasstring 3:
when press save button, nothing happens , nothing saved database. looks not going getasobject method. don't know why. when change component selectonemenu there no problem. selectmanycheckbox thing not working. have idea?
your problem here:
<p:selectmanycheckbox ... value="#{aview.newobject.avalue}">
you're binding value
attribute of input component can get/set multiple values property represents single value. isn't going work. need bind value
attribute collection (e.g. list<avalue>
) or array (e.g. avalue[]
) property instead of single property avalue
.
for example:
public class newobject { private list<avalue> avalues; // ... }
with
<p:selectmanycheckbox ... value="#{aview.newobject.avalues}">
or, alternatively:
public class newobject { private avalue[] avalues; // ... }
with
<p:selectmanycheckbox value="#{aview.newobject.avalues}">
note when use arrays, whole converter not needed. see omnifaces.genericenumconverter
showcase page.
unrelated concrete problem, according java naming conventions, enum class names should start uppercase, regular classes , interfaces, avalue
enum class name bad choice. hungarian notations discouraged in java, way.
update: prove working, here's sscce.
the enum:
public enum value { one, two, three; public string getname() { return name().tolowercase(); } }
the entity:
public class entity { private value[] values; public value[] getvalues() { return values; } public void setvalues(value[] values) { this.values = values; } }
the managed bean:
@managedbean @requestscoped // note: @viewscoped works on sscce. public class bean { private entity entity; @postconstruct public void init() { entity = new entity(); } public void submit() { system.out.println(arrays.tostring(entity.getvalues())); } public entity getentity() { return entity; } public value[] getavailablevalues() { return value.values(); } }
the view (without converter!):
<h:form> <p:selectmanycheckbox value="#{bean.entity.values}"> <f:selectitems value="#{bean.availablevalues}" var="value" itemvalue="#{value}" itemlabel="#{value.name}" /> </p:selectmanycheckbox> <p:commandbutton value="submit" action="#{bean.submit}" /> </h:form>
it works fine me (mojarra 2.1.28 + primefaces 4.0, should work on older versions construct isn't known have bugs).
Comments
Post a Comment