2012-02-27 1 views
1

У меня есть простая форма и перерегистрация одного поля ввода после того, как изменилось другое поле ввода, но значение поля ввода, созданного ajax, никогда не отправляется на мой @ ViewScoped bean. Он всегда равен нулю, а все остальные значения будут переданы правильно.JSF 2 + Richfaces 4 + Seam 3: Отправить форму с введенным полем ввода ajax

<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 никогда не будет называться .. Я не понимаю, почему ?!

ответ

0

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

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}" 

никогда не оказывается

Смежные вопросы