2011-11-15 11 views
3

f:viewparamを使用して、GETリクエストパラメータをJSFページに取得しています。JSFで無効なクエリパラメータのみを無視する

<f:metadata> 
    <f:viewParam name="id" value="#{mediaGroupController.mediaGroupId}"/> 
    <f:viewParam name="type" value="#{mediaGroupController.type}"/> 
    <f:viewParam name="limit" value="#{mediaGroupController.limit}" converter="javax.faces.Integer" > 
    <f:validateLongRange minimum="0"/> 
    </f:viewParam> 
</f:metadata> 

?id=1&type=foo&limit=10のように、すべてに対して有効なパラメータを入力しても問題ありません。ただし、paramsの1つが無効な場合(たとえば、?id=1&type=foo&limit=bar)、idやtypeなどの有効なパラメータも無視されます。

この場合、limitのパラメータを無視したいだけです。それをどうすれば実現できますか?

答えて

4

ConverterExceptionを投げないカスタムコンバータを作成しますが、変換に失敗するとnullが返されます。

など。

@FacesConverter("limitConverter") 
public class LimitConverter { 

    @Override 
    public Object getAsString(FacesContext context, UIComponent component, Object value) { 
     return (value != null) ? String.valueOf(value) : null; 
    } 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     return (value != null && value.matches("\\d+") ? Integer.valueOf(value) : null; 
    } 

} 
+0

ありがとうございます、私はまた別の解決策を掲載しました。あなたは見て、そのアプローチを使用することに欠点があるかどうか確認できますか?私は基本的に私の日付コンバータで同じことをやろうと思っていましたが、コンバータコードを書き換える代わりに、私はただ既存のコンバータに委任すべきです。すべてのコンバータにAOPコンバータを追加して、コンバータへの呼び出しを代行受信して例外をキャッチし、nullを返すようにすることは可能ですか?私はSpringを使用しています。おそらくSpring AOPで可能でしょうか? – ustun

+0

私はあなたの代わりのアプローチも考えましたが、それは簡単な変換のために過度のように思えました。あなたは本当に標準コンバータを拡張することができます。 AOPに関しては、申し訳ありませんが、私はそれに経験を積んでいないので、私には分かりません。 – BalusC

2

別のアプローチで

<f:viewParam name="limit" value="#{mediaGroupController.limit}" converter="limitConverter"> 

既存のコンバータを拡張し、例外をキャッチし、その場合にはnullを返すことがあります。

@FacesConverter("limitConverter") 
public class LimitConverter extends IntegerConverter{ 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     try { 
      return super.getAsString(context, component, value); 
     } catch (ConverterException e) { 
      return null; 
     } 
    } 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     try { 
      return super.getAsObject(context,component, value); 
     } catch (ConverterException e) { 
      return null; 
     } 
    } 
} 
関連する問題