selectManyMenu validation error
jonathan.shin Mar 27, 2007 4:01 PMI created EJB3 ManyToMany entities. User has a many to many relationship with Role. A user can have zero or more roles, and a role can have zero or more users. But, I?m getting validation error (?roles: Value is not a valid option?) when I clicked the ?Save? button.
User Entity:
@Entity @Table(name = "User") public class User implements java.io.Serializable { ... @ManyToMany @JoinTable(name="User_Role", joinColumns=@JoinColumn(name="user_id", referencedColumnName="user_id"), inverseJoinColumns=@JoinColumn(name="role_id", referencedColumnName="role_id") ) public List<Role> getRoles() { return this.roles; } public void setRoles(List<Role> roles) { this.roles = roles; } }
UserHome Object:
@Name("userHome") public class UserHome extends EntityHome<User> { public void setUserUserId(Integer id) { setId(id); } public Integer getUserUserId() { return (Integer) getId(); } @Override protected User createInstance() { User user = new User(); return user; } ... public List<Role> getRoles() { return getInstance() == null ? null : new ArrayList<Role>( getInstance().getRoles()); } }
Role Entity:
@Entity @Name("role") @Scope(SESSION) @Table(name = "Role") public class Role implements java.io.Serializable { private int roleId; private String name; private List<User> users; public Role() { System.out.println("Default Constructor"); } ... @Column(name = "NAME", length = 50) @Length(max = 50) @NotNull public String getName() { return this.name; } public void setName(String name) { this.name = name; } @ManyToMany(mappedBy = "roles") public List<User> getUsers() { return this.users; } public void setUsers(List<User> users) { this.users = users; } }
Converter:
@Name("converters") public class Converters { @Transactional public Converter getRoleConverter() { return new Converter() { @Transactional public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) throws ConverterException { if (arg2 == null) { return null; } try { return ((EntityManager) Component.getInstance("entityManager")).find(Role.class, Integer.valueOf(arg2)); } catch (NumberFormatException e) { throw new ConverterException("Cannot find selected Role", e); } } @Transactional public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) throws ConverterException { if (arg2 instanceof Role) { Role role = (Role) arg2; Integer tempId = (Integer) role.getRoleId(); return tempId.toString(); } else { return null; } } }; } }
UserEdit.xhtml view:
... <h:outputLabel for="role"> Roles </h:outputLabel> <s:decorate id="roleDecoration"> <h:selectManyMenu id="roles" value="#{userHome.instance.roles}" size="5" converter="#{converters.roleConverter}"> <s:selectItems value="#{roleList.resultList}" var="role" label="#{role.name}" noSelectionLabel="Please Select..." hideNoSelectionLabel="true"/> </h:selectManyMenu> </s:decorate> ... <h:commandButton id="save" value="Save" action="#{userHome.persist}" disabled="#{!userHome.wired}" rendered="#{!userHome.managed}"/> ...