У меня есть классы User.java и Roles.java.
@ManagedBean
public class User implements Serializable{
private int id;
private String username;
private String password;
private Role role;
// getters and setters
public String register() throws NoSuchAlgorithmException {
userService.createUser(getUsername(), Util.encryptPassword(getPassword()), getRole().getId());
return "success";
}
}
@ManagedBean
public class Role {
private int id;
private String roleName;
// getters and setters
public List<Role> getAllRoles() {
return roleService.getAllRoles();
}
}
В форме, где я хочу создать пользователя, я хочу предоставить имя пользователя, пароль и roleId.В этом случае пользователь не имеет getRoleId (), но getRole (). GetId ().
<h:form id="newUserForm" prependId="false">
<!-- inputs for username and password -->
<h:outputLabel value="Role: * " />
<h:selectOneMenu value="#{user.role}" converter="#{userRoleConverter}">
<f:selectItems value="#{role.getAllRoles()}" var="r"
itemLabel="#{r.roleName}" itemValue="#{r.id}" />
</h:selectOneMenu>
<h:commandButton type="submit" id="register" value="Register"
action="#{user.register}" />
</h:form>
Тело класса "UserRoleConverter.java" выглядит так:
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value == null || value.isEmpty()) {
return null;
}
try {
return roleService.getRoleById(Integer.valueOf(value));
} catch (NumberFormatException e) {
throw new ConverterException(new FacesMessage(String.format("%s is not a valid Role ID", value)), e);
}
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value == null) {
return "";
}
if (value instanceof Role) {
return String.valueOf(((Role) value).getId());
} else {
throw new ConverterException(new FacesMessage(String.format("%s is not a valid Role", value)));
}
}
В выпадающем списке роли отображаются правильно.Но после того, как я нажимаю кнопку отправки, код не проходит через метод «register ()», и ничего не происходит.Не исключение брошено.Ожидаемый результат - если я выберу, например, роль «ADMIN» (с ID = 1) и отправлю, то в базу данных будет вставлен пользователь с roleId = 1.
Если я заменим атрибут »Роль роль "с" int roleId "и заменить на целочисленный ввод, программа работает нормально.Но я предпочитаю избегать этого решения.
Я искал принятый ответ на этой странице: Как заполнить опции h: selectOneMenu из базы данных? .Класс UserRoleConverter создается так же, как и UserConverter.java в «Сложный объект как выбранный элемент».