Java f:ValueChangeListener使EJB注入无效

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

它可以很好地加载stateList,但是当我更改一个state的值时,它调用backbean,但是addressBO为null。 我怎样才能修好它?还有别的办法吗

提前谢谢

<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);
    }

    // ... 
}