たinvoke私は検証を結合してuserId
Player
に変換しようとするこのf:viewParam
を持っているとき、私は予期しない結果を得ました。F:viewParamコンバータとViewScoped例外うちでは、第二のAJAXリクエスト
@FacesConverter(value="pConverter")
public class PConverter implements Converter {
private static final List<Player> playerList;
static{
playerList = new ArrayList<Player>();
playerList.add(new Player(1, "Harry"));
playerList.add(new Player(2, "Tom"));
playerList.add(new Player(3, "Peter"));
}
@Override
public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
if(value == null || !value.matches("\\d+")){
return null;
}
long id = Long.parseLong(value);
for(Player p : playerList){
if(p.getId() == id){
return p;
}
}
throw new ConverterException(new FacesMessage("Unknown userId: " + value));
}
@Override
public String getAsString(FacesContext fc, UIComponent uic, Object value) {
if(!(value instanceof Player) || value == null){
return null;
}
return String.valueOf(((Player)value).getId());
}
}
ように見える
<f:metadata>
<f:viewParam name="userId" value="#{myBean.selectedPlayer}" converter="pConverter"
converterMessage="Bad Request. Unknown User" required="true"
requiredMessage="Bad Request. Please use a link from within the system" />
</f:metadata>
<h:body>
<p:messages id="msgs"/>
<h:form>
<ul>
<li><a href="index2.xhtml?userId=1">Harry</a></li>
<li><a href="index2.xhtml?userId=2">Tom</a></li>
<li><a href="index2.xhtml?userId=3">Peter</a></li>
</ul>
</h:form>
<h:form>
<h:panelGrid columns="2" rendered="#{not empty myBean.selectedPlayer}">
<h:outputText value="Id: #{myBean.selectedPlayer.id}"/>
<h:outputText value="Name: #{myBean.selectedPlayer.name}"/>
</h:panelGrid>
</h:form>
<h:form id="testForm">
<h:inputText value="#{myBean.text}"/>
<p:commandButton value="Switch" update=":msgs testForm"/>
<h:outputText value="#{myBean.text}" rendered="#{not empty myBean.text}"/>
</h:form>
</h:body>
。それはidを変換してplayer
を私のマネージドBeanに戻します。次に、テキストボックスに何かを入力して、Switch
をクリックすると、最初に正常に動作し、入力した内容がボタンの隣に表示されますが、入力した内容が変更され、Switch
を再度クリックすると、エラーメッセージが表示されますBad Request. Please use a link from within the system
f:viewParam
の場合はrequired
のエラーメッセージが表示されます。私がf:viewParamを取り出した場合、すべて正常に動作します。驚いたことに、私がf:viewParamからo:viewParam(OmniFaces)に切り替えると、うまく動作します。
ありがとうございました。 Omnifacesはかなり素晴らしいです、BalusC。私はあなたのブログで、 'o:viewParam'に関する1つの質問を持っていますが、ajaxリクエストが呼び出されるたびに全部が' Converter'を呼び出さないように言いましたが、常にメソッド 'getAsString()'の中に入っているようです。だから私はこの動作が正しいかどうか疑問に思います。 'getAsObject'はモデル値を設定するものなので、' getAsObject'を呼び出さないと大きな改善ができません。それに感謝します。 –
'getAsString()'は、オブジェクトを文字列に変換する必要があるときに呼び出されます(生成されたHTMLに表示されます)。しかし、それはすでにそのプロパティの文字列値になっているので、かなり安い仕事でなければなりません。その時点ですでにオブジェクトを手にしているので、高価なDBジョブは必要ありません。 – BalusC
ありがとうございました。 –