FacesComponent 在一个页面中有效,但在其他页面中无效(从 ajax 事件中检索 null)

FacesComponent works in one page but doesn't in others (retrieves null from ajax event)

我不知道是否有解决的问题。如果是这样,我找不到它。

我正在创建一个包含两个触发事件的 SelectOneMenu 的复合组件。 问题是该组件在一个 jsf 中有效,但在其他 jsf 中无效。

该组件位于三个不同的 xhtml 中。在所有这些事件中,当我更改第一个 SelectOneMenu 的值时,事件被触发,但只有在其中一个 xhtml 中,SelectItem 的值不为空。在其余部分中,检索到的值为 "null"

 //In p001DatosNotificacion.xhtml, it retrieves the selected value of the selectonemenu (b, for example)
 //In the others it retrieves null

 UISelectOne oneVoewl = (UISelectOne)event.getSource();
 System.out.println("One Voewl > " + oneVoewl.getValue());

任何人都可以帮助我并告诉我我在哪里犯了错误吗?

提前致谢!

代码

组件支持 bean

@FacesComponent(value="letterExample")
public class LetterExample extends UINamingContainer{

    public void voewlAjaxListener(AjaxBehaviorEvent event){
        UISelectOne oneVoewl = (UISelectOne)event.getSource();
        System.out.println("One Voewl > " + oneVoewl.getValue());

    }

复合组件注意:我正在使用现有的 bean 进行测试

<cc:interface componentType="letterExample" >
    <cc:attribute name="bean" type="es.ccasa.sgnx.business.bean.Direccion" />
</cc:interface>


<cc:implementation>

    <p:selectOneMenu id="oneMenuVoewl" value="#{cc.attrs.bean.codigoPais}" 
        binding="#{cc.uiSelectOneVoewl}" >
            <f:selectItem itemLabel="Aaaa" itemValue="a" />
            <f:selectItem itemLabel="Eeee" itemValue="e" />
            <f:selectItem itemLabel="Iiii" itemValue="i" />
            <f:selectItem itemLabel="Oooo" itemValue="o" />
            <f:selectItem itemLabel="Uuuu" itemValue="u" />
        <p:ajax event="change"  listener="#{cc.voewlAjaxListener}" update="consonantWrapper" />
    </p:selectOneMenu>

    <h:panelGroup id="consonantWrapper" layout="block">
        <p:selectOneMenu id="oneMenuConsonant"  value="#{cc.attrs.bean.codigoProvincia}"
            binding="#{cc.uiSelectOneConsonant}">
                <f:selectItem itemLabel="Bbbb" itemValue="b" />
                <f:selectItem itemLabel="Cccc" itemValue="c" />
                <f:selectItem itemLabel="Dddd" itemValue="d" />
        </p:selectOneMenu>

    </h:panelGroup>

</cc:implementation>

豆豆

public class Direccion implements Serializable {
    private String codigoPais; /* with its getter and setter*/
    private String codigoProvincia; /* with its getter and setter*/

}

XHTML 这是我在xhtml页面中使用的方式:(控制器名称的变化取决于当前控制器)

<sgnx:letter-example bean="#{controller.direccion}" />

@Named beans

@Named
@ViewScoped
public class P001DatosNotificacionController
    private Direccion direccion; /* with its getter and setter*/

@Named
@ViewScoped
public class P001GestionNotificacionesController
    private Direccion direccion; /* with its getter and setter*/

@Named
@ViewScoped
public class P002BandejaProvisionalNotificacionesController
    private Direccion direccion; /* with its getter and setter*/

几周后我又回到了这个问题上。 我决定从头再来。

当我开始编写控制器代码并用 @ViewScoped 注释时,我意识到 javax.faces.beanjavax.faces.view

那是个错误。我使用了错误的组合:

import javax.inject.Named;    
import javax.faces.bean.ViewScoped;

因此,解决方案就像使用正确的包组合一样简单:

import javax.inject.Named;
import javax.faces.view.ViewScoped;

这些帖子里有答案和解释:

  1. @ViewScoped bean recreated on every postback request when using JSF 2.2
  2. ManagedProperty in CDI @Named bean returns null