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