JSF2 Управляемая инициализация переменной Bean - PullRequest
1 голос
/ 21 ноября 2011

У меня проблемы с инициализацией 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, показать форму с предварительно заполненными данными затем дайте возможность изменить данные и, наконец, отправьте форму для сохранения новых значений в БД

Спасибо всем

1 Ответ

1 голос
/ 21 ноября 2011

Если поместить компонент в область просмотра и использовать <f:viewParam>, это не вариант, тогда вам нужно будет передать параметр обратно в следующий запрос, включив его как <f:param> в компонент UICommand:

<p:commandButton action="#{editUserController.saveUser}"
    style="margin-top:20px;" ajax="false"
    value="#{cms['general.save']}">
    <f:param name="id" value="#{editUserController.id}" />
</p:commandButton>

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...