3

私は次のコードを持っています:

<label for="aluRegs">Región de residencia</label>
<rich:select id="aluRegs" defaultLabel="Seleccionar región" value="#{IngresoAlumno.lugarAlumno.regionElegida}" required="true">
    <f:selectItems value="#{IngresoAlumno.lugarAlumno.regiones.entrySet()}" var="region" itemValue="#{region.key}" itemLabel="#{region.value}" />
    <a4j:ajax event="change" render="aluProvs" listener="#{IngresoAlumno.lugarAlumno.updateProvincias()}" />
    <f:validateRequired />
    <rich:validator />
</rich:select>
<rich:message for="aluRegs" ajaxRendered="true" />

<label for="aluProvs">Provincia de residencia</label>
<rich:select id="aluProvs" defaultLabel="Seleccionar provincia" value="#{IngresoAlumno.lugarAlumno.provinciaElegida}" required="true">
    <f:selectItems value="#{IngresoAlumno.lugarAlumno.provincias.entrySet()}" var="prov" itemValue="#{prov.key}" itemLabel="#{prov.value}" />
    <a4j:ajax event="change" render="aluComs" listener="#{IngresoAlumno.lugarAlumno.updateComunas()}" />
    <f:validateRequired />
    <rich:validator />
</rich:select>
<rich:message for="aluProvs" ajaxRendered="true" />

<label for="aluComs">Comuna de residencia</label>
<rich:select id="aluComs" defaultLabel="Seleccionar comuna" value="#{IngresoAlumno.lugarAlumno.comunaElegida}" required="true">
<f:selectItems value="#{IngresoAlumno.lugarAlumno.comunas.entrySet()}" var="com" itemValue="#{com.key}" itemLabel="#{com.value}" />
    <f:validateRequired />
    <rich:validator />
</rich:select>
<rich:message for="aluComs" ajaxRendered="true" />

そして、次のJavaコード

@ManagedBean(name="IngresoAlumno")
@ViewScoped
public class IngresoAlumnoBean {

    private Alumno al;
    private StaticInfoBean lugarAlumno;
//+constructor, getters and setters

そして、次のクラス:

public class StaticInfoBean {

    private Map<String, Region> regiones;
    private String regionElegida;

    private Map<String, Provincia> provincias;
    private String provinciaElegida;

    private Map<String, Comuna> comunas;
    private String comunaElegida;

    private String err; //Being used for debugging

    public StaticInfoBean() {
        try
        {
            err = "INICIO";
            ArrayList<Region> regs;
            regiones = new LinkedHashMap<String, Region>();
            provincias = new LinkedHashMap<String, Provincia>();
            comunas = new LinkedHashMap<String, Comuna>();
            RegionDAO regDao = new RegionDAO();
            regDao.prepareConnection();
            ProvinciaDAO provDao = new ProvinciaDAO();
            provDao.setCon(regDao.getCon());
            ComunaDAO comDao = new ComunaDAO();
            comDao.setCon(regDao.getCon());
            regs = regDao.listaRegiones();
            for(Region r : regs)
            {
                regDao.findProvincias(r);
                for(Provincia p : r.getProvincias())
                {
                    provDao.findComunas(p);
                    for(Comuna c : p.getComunas())
                    {
                        comDao.findColegios(c);
                    }
                }
                regiones.put(r.getReg_Cod(), r);
            }
            regDao.getCon().close();
            err="FINAL";
            System.out.println(err);
        }
        catch(SQLException e)
        {
            err = e.getSQLState()+" "+e.getMessage();
        }
        catch(Exception e)
        {
            err = e.getMessage();
        }
    }
//+getters, setters

public void updateProvincias(){
    provincias.clear();
    for(Provincia p : regiones.get(regionElegida).getProvincias())
    {
        provincias.put(p.getProv_Cod(), p);
    }
    System.out.println(provincias.entrySet().toString());
}

public void updateComunas(){
    if(provinciaElegida==null || provincias==null)
        return;
    comunas.clear();
    for(Comuna c : provincias.get(provinciaElegida).getComunas())
    {
        comunas.put(c.getCom_Cod(), c);
    }
}

Richfaces 4 を使用しています。昨日、Mojarra を 2.1.x (どれか覚えていません) から最新のもの (2.1.11) にアップグレードしましたが、これは機能しなくなりました (更新する前は問題なく機能していました)。エラーをselectタグのrenderプロパティに絞り込みました(System.out.println(provincias.entrySet().toString());正しい値が表示されているので、リスナーが呼び出されていると安全に想定できます)が、ここで何をすべきかわかりません。よろしくお願いします。

編集:追加情報として、最初の選択で値が正しく表示されます。問題は、a4j:ajax が 2 番目の選択を再レンダリングする場合です。また、使用f:ajaxしても同じ結果が得られます。ajax リスナーは引き続き機能しますが、選択メニューは再びレンダリングされません。

また、次の実験も行いました。

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:rosc="http://richfaces.org/sandbox/colorpicker">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <rich:select value="#{IngresoAlumno.al.per_Nombre}">
                <f:selectItem itemValue="1" itemLabel="1" />
                <f:selectItem itemValue="2" itemLabel="2" />
                <a4j:ajax render="out" event="change" />
            </rich:select>
        </h:form>
        <h:outputText id="out" value="#{IngresoAlumno.al.per_Nombre}" />
    </h:body>
</html>

これは完璧に機能します!エラー自体が何であるかはまだわかりません。

4

1 に答える 1

2

私はそれを見つけましたが、どうやらそれはRichFacesのバグです。

これは機能しません:

<rich:select id="aluProvs" defaultLabel="Seleccionar provincia" value="#{IngresoAlumno.lugarAlumno.provinciaElegida}" required="true">
    <f:selectItems value="#{IngresoAlumno.lugarAlumno.provincias.entrySet()}" var="prov" itemValue="#{prov.key}" itemLabel="#{prov.value}" />
    <a4j:ajax event="change" render="aluComs" listener="#{IngresoAlumno.lugarAlumno.updateComunas()}" />
    <f:validateRequired />
    <rich:validator />
</rich:select>

これも機能しません:

<rich:select id="aluProvs" defaultLabel="Seleccionar provincia" value="#{IngresoAlumno.lugarAlumno.provinciaElegida}" required="true">
    <f:selectItems value="#{IngresoAlumno.lugarAlumno.provincias.entrySet()}" var="prov" itemValue="#{prov.key}" itemLabel="#{prov.value}" />
    <a4j:ajax event="change" render="aluComs" listener="#{IngresoAlumno.lugarAlumno.updateComunas()}" />
    <rich:validator />
</rich:select>

これは機能します:

<rich:select id="aluProvs" defaultLabel="Seleccionar provincia" value="#{IngresoAlumno.lugarAlumno.provinciaElegida}" required="true">
    <f:selectItems value="#{IngresoAlumno.lugarAlumno.provincias.entrySet()}" var="prov" itemValue="#{prov.key}" itemLabel="#{prov.value}" />
    <a4j:ajax event="change" render="aluComs" listener="#{IngresoAlumno.lugarAlumno.updateComunas()}" />
    <f:validateRequired />
</rich:select>

これも同様に機能します:

<rich:select id="aluProvs" defaultLabel="Seleccionar provincia" value="#{IngresoAlumno.lugarAlumno.provinciaElegida}" required="true">
    <f:selectItems value="#{IngresoAlumno.lugarAlumno.provincias.entrySet()}" var="prov" itemValue="#{prov.key}" itemLabel="#{prov.value}" />
    <a4j:ajax event="change" render="aluComs" listener="#{IngresoAlumno.lugarAlumno.updateComunas()}" />
</rich:select>

それはバグですか、それとも機能ですか?私はそれを報告する必要がありますか?しかし、いずれにせよ、見つけるのは非常に困難でした。

于 2012-08-06T05:45:28.787 に答える