0

名前、開始番号、終了番号の 3 つの h:inputText があります。

Bean クラスに示されているように、validateName と validateNumber の 2 つのカスタム検証関数があります。関数は、show.xhtml に示すように呼び出されます。

その中で、validateName() は正常に実行されますが、validateNumber() で次のようなエラーが生成されます。

show.xhtml @83,93 validator="#{myBean.validateNumber}": java.lang.NullPointerException

83 行目は次のとおりです。

<h:inputText id="idstart" value="#{myBean.start}" validator="#{myBean.validateNumber}"/>

show.xhtml:

<h:inputText id="name" required="true" requiredMessage="Name cannot be empty!" value="#{myBean.name}" validator="#{myBean.validateName}">
<rich:message for="name"/>

<h:inputText id="idstart" value="#{myBean.start}" validator="#{myBean.validateNumber}"/>
<rich:message for="id1"/>

<h:inputText id="id2" value="#{myBean.end}" />

SessionScoped Bean:

import javax.faces.application.Application;
import javax.faces.validator.ValidatorException;
public class MyBean
{
private Integer start;
private Integer end;
private String name;

public void validateName(FacesContext context,UIComponent component,Object value)throws ValidatorException
    {
        String name=value.toString();
        /*Code for having Unique name */
        FacesMessage msg = new FacesMessage("Unique Validation failed","Name used is already existing");
                 msg.setSeverity(FacesMessage.SEVERITY_ERROR);
                 throw new ValidatorException(msg);
            }           
        }
    }

public void validateNumber(FacesContext context,UIComponent component,Object value)throws ValidatorException
    {

        if(start > end)
            {
            FacesMessage msg = new FacesMessage("Number Validation failed","Start Number Should be less the End Number");
                 msg.setSeverity(FacesMessage.SEVERITY_ERROR);
                 throw new ValidatorException(msg);
            }           
    }

}
4

1 に答える 1

1

バリデータ内から Bean のプロパティに直接アクセスしないでください。つまり、その時点ではまだ設定されていません。JSF は、モデル値を更新する (フェーズ 4) 前に、最初に検証 (フェーズ 3) を処理する必要があります。代わりに、バリデータ メソッドの 3 番目の引数またはコンポーネント ツリーから値を取得する必要があります。

メソッドでは、validateNumber3 番目の引数は開始日です。終了日は、その時点ではまだ変換/検証されていません。リクエスト パラメータ マップから手動で取得する必要があります。

String end = context.getExternalContext().getRequestParameterMap().get("formIc:id2");

(あなたの親formIdの はどこにありますか? ところで、 はひどい選択です。むしろ、より賢明で自己記録的なものを選択してください。)id<h:form>id2end

またはコンポーネントツリーから送信された値として:

UIForm formComponent = (UIForm) component.getNamingContainer();
UIInput endComponent = (UIInput) formComponent.findComponent("id2");
String end = endComponent.getSubmittedValue();

以下も参照してください。

于 2013-03-14T01:35:39.813 に答える