0

私はJSFページを持っています。私の目的は、データベースからパターンを取得してバリデーターを動的に構築することです。

以下のコードが機能しません。つまり、正規表現は失敗します。

<p:inputText value="#{basvuruBean.basvuru.sistem.tavsiyeEdilenID}" 
             requiredMessage="Lütfen Tavsiye Edilen ID giriniz"
             validatorMessage="#{basvuruBean.basvuru.sistem.tavsiyeEdilenIDHataMesaji}"
             rendered="#{basvuruBean.basvuru.sistem.tavsiyeEdilenIDRendered}">
    <f:validateRegex pattern="#{basvuruBean.basvuru.sistem.tavsiyeEdilenIDRegEX}" />
</p:inputText>

しかし、これは期待どおりに機能します

<p:inputText value="#{basvuruBean.basvuru.sistem.tavsiyeEdilenID}" 
             requiredMessage="Lütfen Tavsiye Edilen ID giriniz"
             validatorMessage="#{basvuruBean.basvuru.sistem.tavsiyeEdilenIDHataMesaji}"
             rendered="#{basvuruBean.basvuru.sistem.tavsiyeEdilenIDRendered}">
    <f:validateRegex pattern="\d" />
</p:inputText>

basvuruBean.basvuru.sistem.tavsiyeEdilenIDRegEXに等しい\d。JSFページに印刷して確認しました。

それを機能させるにはどうすればよいですか?

バッキングビーンの関連部分

import java.io.IOException;
import com.itextpdf.text.DocumentException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.FlowEvent;

@ManagedBean
@ViewScoped
public class BasvuruBean implements Serializable {

private Basvuru basvuru = new Basvuru();
private Sistem sistem;

private static final long serialVersionUID = 1L;
private String url;
private List<Sistem> sistemler = new ArrayList<Sistem>();
private SistemDAO sistemDAO = new SistemDAO();

    @PostConstruct
void initialiseSession() {
    FacesContext.getCurrentInstance().getExternalContext().getSession(true);
    sistem=sistemler.get(0);
}

public BasvuruBean() {

    sistemler = sistemDAO.tumSistemler();


    this.basvuru.setSistem(sistem);
    this.basvuru.setSirketAdi("Şirket Adı");
    this.basvuru.setePosta("posta@sirket.com");

}


public void sistemChangeListener() {

    System.out.println(sistem.getSistemAdi());
    sistem.setKapsamaYaricapi(this.sistem.getKapsamaYaricapiDefault());
    this.sistem.setKapsamaYuksekligi(this.sistem.getKapsamaYuksekligiDefault());
    this.sistem.setFrekansMax(this.sistem.getFrekansMaxDefault());
    this.sistem.setFrekansMin(this.sistem.getFrekansMinDefault());
    this.sistem.setTavsiyeEdilenID(this.sistem.getTavsiyeEdilenIDDefault());
    this.sistem.setRunway(this.sistem.getRunwayDefault());
    this.sistem.setTrueRadiationDirection(this.sistem.getTrueRadiationDirectionDefault());
    this.sistem.setApproachCAT(this.sistem.getApproachCATDefault());
    this.sistem.setAntenVericiGucuDefault(this.sistem.getAntenVericiGucuDefault());
    this.sistem.setAntenYuksekligiAGL(this.sistem.getAntenYuksekligiAGLDefault());
    this.sistem.setFrekans(this.sistem.getFrekansDefault());
}
}

システムオブジェクトを変更するselectonemenu

<p:selectOneMenu value="#{basvuruBean.basvuru.sistem}" converter="sistemConverter">
  <f:selectItems value="#{basvuruBean.sistemler}" var="s" itemLabel="#{s.sistemAdi}" itemValue="#{s}" />
  <p:ajax listener="#{basvuruBean.sistemChangeListener}" update="p2 genelbilgi" />
</p:selectOneMenu>
4

1 に答える 1

1

コードは比較的扱いにくいため、原因を特定するのは困難です。

実際には、これ<f:validateRegex>はビューのビルド時間タグです。そのため、ビュー スコープの Bean プロパティを参照すると、 のような UI コンポーネントで参照されるインスタンスとは異なる、まったく新しいインスタンスが作成されます<p:selectOneMenu>。したがって、事実上、2 つのバッキング Bean インスタンスが作成されます。1 つは によって参照され<f:validateRegex>、もう 1 つは によって参照され<p:selectOneMenu>ます<p:ajax>。したがって、1 つの Bean インスタンスで ajax によって正規表現パターンを操作すると、他の Bean インスタンスには反映されません。

考えられる設計上の問題はさておき、OmniFaces の の代わりに を使用することで、特定の機能上の問題を<o:validator>解決できます<f:validateRegex>

<o:validator validatorId="javax.faces.RegularExpression" pattern="#{basvuruBean.basvuru.sistem.tavsiyeEdilenIDRegEX}" />

これにより、ビルド時ではなくレンダリング時に属性が解決されます。

于 2013-03-13T15:36:58.183 に答える