Java f:ValueChangeListener使EJB注入无效
它可以很好地加载stateList,但是当我更改一个state的值时,它调用backbean,但是addressBO为null。 我怎样才能修好它?还有别的办法吗 提前谢谢Java f:ValueChangeListener使EJB注入无效,java,jsf,jsf-2,ejb,valuechangelistener,Java,Jsf,Jsf 2,Ejb,Valuechangelistener,它可以很好地加载stateList,但是当我更改一个state的值时,它调用backbean,但是addressBO为null。 我怎样才能修好它?还有别的办法吗 提前谢谢 <h:selectOneMenu id="stateList" value="#{newUserController.address.stateID}"> <f:selectItems value="#{addressController.stateList}" /> <f:valueCha
<h:selectOneMenu id="stateList" value="#{newUserController.address.stateID}">
<f:selectItems value="#{addressController.stateList}" />
<f:valueChangeListener type="controller.address.AddressController"/>
<f:ajax event="change" render="cidadeList"/>
</h:selectOneMenu>
<h:selectOneMenu id="cityList" value="#{newUserController.address.cityID}">
<f:selectItems value="#{addressController.cityList}" />
</h:selectOneMenu>
另一个backbean设置了本例中未出现的地址和用户的值
package controller.user;
@ManagedBean
@RequestScoped
public class NewUserController {
private Address address;
private User user;
@EJB
private NewUserBO newUserBO;
public void registerNewUser() {
newUserBO.register(user, address);
}
public Address getAddress() {
return this.address;
}
public void setAddress(Address address) {
this.address = address;
}
public User getUser() {
return this.user;
}
public void setUser(User user) {
this.user = user;
}
}
第一个问题是,您正在
标记中创建一个全新的类实例。这不是@ManagedBean
引用的同一个实例,与托管bean相关的注释也不会在该实例上调用。您更希望在
上使用valueChangeListener=“#{addressController.processValueChange}”
。但这并不能立即解决所有问题。变化很大,第二个列表的行为与预期不符
第二个问题是在验证阶段调用值更改侦听器方法。这是更改/加载模型值的错误时刻。您应该在调用操作阶段执行此操作。使用
的侦听器属性
因此:
与
第一个问题是,您正在
标记中创建一个全新的类实例。这不是@ManagedBean
引用的同一个实例,与托管bean相关的注释也不会在该实例上调用。您更希望在
上使用valueChangeListener=“#{addressController.processValueChange}”
。但这并不能立即解决所有问题。变化很大,第二个列表的行为与预期不符
第二个问题是在验证阶段调用值更改侦听器方法。这是更改/加载模型值的错误时刻。您应该在调用操作阶段执行此操作。使用
的侦听器属性
因此:
与
您的视图代码与bean代码不匹配,因此您的问题非常混乱。请修复它(附言:请尝试在代码中始终使用英语,不仅在这里如此,而且在您的真实代码中,它将极大地提高您的英语水平,并极大地有利于我们、pedians和您未来的代码维护者)。到目前为止,我只能说:您根本不需要ValueChangeListener
。您对旧值不感兴趣。城市列表将根据州的值加载。我已经有点懂英语了,但是在写我想要的东西时仍然有一些问题。技术英语对我来说并不容易。我们仍在考虑将代码翻译成英语,但只有巴西人在编码。有时间我们会把它提高到英语水平。现在没有时间了:(我不需要旧的值,但是,如果不使用ValueChangeListener
,我怎么做?您的视图代码与bean代码不匹配,因此您的问题/问题非常混乱。请修复它(注:请尽可能在代码中使用英语,不仅在这里如此,而且在您的真实代码中,这将极大地提高您的英语水平,并大大有利于我们、儿科医生和您未来的代码维护人员).到目前为止,我只能说:你根本不需要ValueChangeListener
。你对旧的价值不感兴趣。城市列表将根据州的价值加载。我已经有点懂英语,但在写我想要的东西时仍有一些问题。而技术英语对我来说并不容易。我们仍在考虑将代码翻译成英语,但只有巴西人在编写代码。我们会在有时间时将其改进为英语。现在没有时间了:(我不需要旧值,但是,如果不使用ValueChangeListener
,我怎么做?
package controller.user;
@ManagedBean
@RequestScoped
public class NewUserController {
private Address address;
private User user;
@EJB
private NewUserBO newUserBO;
public void registerNewUser() {
newUserBO.register(user, address);
}
public Address getAddress() {
return this.address;
}
public void setAddress(Address address) {
this.address = address;
}
public User getUser() {
return this.user;
}
public void setUser(User user) {
this.user = user;
}
}
@ManagedBean
@RequestScoped
public class AddressController {
@EJB
private AddressBO addressBO;
@PostConstruct
public void init() {
stateList = enderecoBO.loadStateListSelectItem();
}
public void changeState(AjaxBehaviorEvent event) {
String state = (String) ((UIInput) event.getComponent()).getValue();
cityList = addressBO.loadCityList(state);
}
// ...
}