JSF 2 + Richfaces 4 + Seam 3: отправка формы с полем ввода, отображаемым с помощью ajax - PullRequest
1 голос
/ 27 февраля 2012

У меня есть простая форма, и я изменяю одно поле ввода после изменения другого поля ввода, но значение поля ввода, отображаемого с помощью ajax, никогда не публикуется в моем компоненте @ViewScoped.Это всегда ноль, в то время как все другие значения будут переданы должным образом.

    <h:form id="userAddForm">
            <div>
                <h:outputLabel for="userRole" value="role" />
                <h:selectOneMenu id="userRole" value="#{addUser.role}">
                    <f:selectItems value="#{addUser.userRoles}" />
                    <a4j:ajax event="valueChange" render="optionalIn" execute="@this" />
                </h:selectOneMenu>
            </div>

...

 <a4j:outputPanel id="optionalIn" layout="block">
 <div>
            <h:panelGroup rendered="#{addUser.role eq 'MERCHANT'}">

                        <h:outputLabel for="service" value="service url" />
                        <h:inputText id="service" value="#{addUser.service}"
                            style="width: 175px;" >
                        </h:inputText>  

            </h:panelGroup> 
            </div>      
        </a4j:outputPanel>


        <div class="buttonBox">
            <h:commandButton render="@form" execute="@form" id="save" action="#{addUser.save}" value="Save" />
            <h:commandButton id="cancel" value="Cancel"
                action="#{addUser.cancel}" immediate="true" />
        </div>


    </h:form>

Боб:

@ViewScoped
public class AddUser implements Serializable {

    @Inject
    private UserHelper userHelper;

    @Inject
    private Messages messages;

    private User newUser;
    private UserRole role;
    private List<UserRole> userRoles = new ArrayList<UserRole>();
    private String service;

    @PostConstruct
    public void init(){
        if(userRoles.isEmpty()){
            userRoles.add(UserRole.ADMIN);
            userRoles.add(UserRole.CUSTOMER);
            userRoles.add(UserRole.MERCHANT);
        };
        setRole(userRoles.get(1));
        System.out.println("create");
    }

    public User getNewUser() {
        return newUser;
    }

    public void setNewUser(User newUser) {
        this.newUser = newUser;
        System.out.println("set User");
    }

    public void setRole(UserRole role) {
        System.out.println("role" + role);

        this.role = role;
        if (role.equals(UserRole.CUSTOMER)) {
            newUser = new Customer();
        }else if(role.equals(UserRole.MERCHANT)){
            newUser = new Merchant();
        }else if(role.equals(UserRole.ADMIN)){
            newUser = new Admin();
        }
    }

    public UserRole getRole() {
        if (role == null) {
            role = UserRole.ADMIN;
        }
        return role;
    }

    public List<UserRole> getUserRoles() {
        return userRoles;
    }

    public String getService() {
        return service;
    }

    public void setService(String service) {
        this.service = service;
        System.out.println("set url");
    }

    public String save() {
        newUser.setPin(SHAHelper.StringToSHA256(newUser.getPin()));
        if (role.equals(UserRole.CUSTOMER)) {
            userHelper.addUser(newUser);
        }else if(role.equals(UserRole.MERCHANT)){
            ((Merchant) newUser).setServiceUrl(service);
            userHelper.addUser(newUser);
        }else if(role.equals(UserRole.ADMIN)){
            userHelper.addUser(newUser);
        }

        return "/page/admin/userList.xhtml?faces-redirect=true";
    }

    public String cancel() {
        return "/page/admin/userList.xhtml?faces-redirect=true";
    }

Метод setService никогда не будет вызываться .. Я не понимаю, почему?!

1 Ответ

0 голосов
/ 11 сентября 2012

может быть поздно, но у вас есть следующее в вашем шаблоне:

rendered="#{addUser.role eq 'MERCHANT'}"

, а в вашем инициализации у вас есть:

    if(userRoles.isEmpty()){
        userRoles.add(UserRole.ADMIN);
        userRoles.add(UserRole.CUSTOMER);
        userRoles.add(UserRole.MERCHANT);
    };
    setRole(userRoles.get(1));

, так что на самом деле, как я вижу, роль - ЗАКАЗЧИК,поэтому ваше поле для

value="#{addUser.service}"

никогда не отображается

...