У меня проблемы с инициализацией bean-компонента. У меня есть форма редактирования для обновления
некоторые пользовательские данные. Пользователь предварительно создан в базе данных и
Я успешно извлекаю данные и помещаю их в форму.
Это форма с параметром id 1 (/cms/admin/users/edit.jsf?id=1):
<h:panelGrid styleClass="general-form" columns="3" id="ajaxForm">
<h:outputLabel for="name" value="#{cms['users.add.name']}" />
<p:inputText required="true" id="name"
value="#{editUserController.user.name}"
label="#{cms['users.add.name']}">
<f:validateLength minimum="3" />
</p:inputText>
<p:message for="name" />
<h:outputLabel value="#{cms['users.add.lastname']}" />
<p:inputText id="lastname" label="#{cms['users.add.lastname']}"
required="true" value="#{editUserController.user.lastname}">
<f:validateLength minimum="3" />
</p:inputText>
<p:message for="lastname" />
<h:outputLabel value="#{cms['users.add.username']}" />
<p:inputText id="username" required="true"
label="#{cms['users.add.username']}"
value="#{editUserController.user.username}">
<f:validateLength minimum="3" />
</p:inputText>
<p:message for="username" />
<h:outputLabel value="#{cms['users.add.password']}" />
<p:password id="password" required="true"
value="#{editUserController.user.password}"
promptLabel="#{cms['users.error.enterPassword']}"
weakLabel="#{cms['users.error.weakPassword']}"
goodLabel="#{cms['users.error.goodPassword']}"
strongLabel="#{cms['users.error.strongPassword']}"
binding="#{password}" label="#{cms['users.add.password']}">
<f:validateLength minimum="6" />
</p:password>
<p:message for="password" />
<h:outputLabel value="#{cms['users.add.confirmPassword']}" />
<p:password id="passwordConfirm" required="true"
value="#{editUserController.confirmPassword}"
promptLabel="#{cms['users.error.enterPassword']}"
weakLabel="#{cms['users.error.weakPassword']}"
goodLabel="#{cms['users.error.goodPassword']}"
strongLabel="#{cms['users.error.strongPassword']}"
label="#{cms['users.add.confirmPassword']}">
<f:validateLength minimum="6" />
<f:validator validatorId="passwordValidator" />
<f:attribute name="password" value="#{password.value}" />
</p:password>
<p:message for="passwordConfirm" />
<h:outputLabel value="#{cms['users.add.active']}" />
<h:selectOneMenu value="#{editUserController.user.active}">
<f:selectItem itemValue="true" itemLabel="Sí" />
<f:selectItem itemValue="false" itemLabel="No" />
</h:selectOneMenu>
<h:outputText value="" />
<h:outputLabel value="#{cms['users.add.role']}" />
<h:selectOneMenu value="#{editUserController.securityRole}">
<f:selectItems value="#{editUserController.securityRoles}" />
</h:selectOneMenu>
<h:outputText value="" />
<h:outputText value="" />
<p:commandButton action="#{editUserController.saveUser}"
style="margin-top:20px;" ajax="false"
value="#{cms['general.save']}"></p:commandButton>
Это управляемый компонент (EditUserController.java):
public class EditUserController extends GeneralController implements
Serializable {
private static final long serialVersionUID = 1L;
@ManagedProperty("#{param.id}")
private Integer id;
private UserService userService;
private SecurityRoleService securityRoleService;
private User user;
private String confirmPassword;
private Map<String, SecurityRole> securityRoles;
private String securityRole;
@PostConstruct
public String checkUser() {
try {
FacesContext facesContext = FacesContext.getCurrentInstance();
this.id = Integer.parseInt(facesContext.getExternalContext().getRequestParameterMap().get("id"));
setUser(userService.findById(id));
Map<String, SecurityRole> secRoles = new ListUtils<String>().toMap(
securityRoleService.findAll(0, 30, "", ""), "name");
setSecurityRoles(secRoles);
setSecurityRole(user.getSecurityRole().getId().toString());
return "edit";
} catch (EntityNotFoundException e) {
return FATAL;
} catch (NoSuchMethodException e) {
return FATAL;
} catch (InvocationTargetException e) {
return FATAL;
} catch (IllegalAccessException e) {
return FATAL;
}
}
public String saveUser() {
try {
System.out.println("User saved!!");
return SUCCESS;
} catch (Exception e) {
FacesContext.getCurrentInstance().addMessage(
null,
new FacesMessage(MessageProvider.getMessageProvider()
.getValue("cms", "general.error")));
return ERROR;
}
}
//getters and setters ...
С помощью метода @Postconstruct я инициализирую переменную user в соответствии с id param .
Тогда форма отображается правильно со всеми данными, предварительно заполненными. Но когда я нажимаю в
commandButton Я получаю исключение:
Error creating bean with name 'editUserController': Invocation of init method failed; nested exception is java.lang.NumberFormatException: null
Я понимаю, где ошибка. В методе @Postconstruct переменная id не имеет
был "инициализирован", потому что в запросе нет параметра id . Я знаю, что могу решить это
готовит бин к сеансу или приложению, но нет никакого смысла иметь бин там
просто чтобы выполнить это простое действие.
Как я могу сделать эту простую форму? Я просто хочу получить параметр id, показать форму с предварительно заполненными данными
затем дайте возможность изменить данные и, наконец, отправьте форму для сохранения новых значений
в БД
Спасибо всем