MyFaces 1.0.9 のStringArrayConverterのgetAsObjectメソッド
仕事でS2JSF 1.0.17(だったと思う)をいじっていたら、下記の現象に遭遇した。
入力画面で選択必須(m:required=true)でないチェックボックスに何もチェックせずに、
確認画面に遷移後戻るリンクで戻った場合にヌルポになる。
もし何かにチェックして遷移して戻った場合に値を復元できるように確認画面ではhiddenを使っている。
ヌルポになるのはMyFaces 1.0.9 の独自コンバーターであるStringArrayConverterのgetAsObjectメソッドでvalueにnullがわたってくるから(StringTokenizerのvalueのところにnullがきてヌルポが発生)。
public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException { try { StringTokenizer tokenizer = new StringTokenizer(value, ","); String[] newValue = new String[tokenizer.countTokens()]; for (int i = 0; tokenizer.hasMoreTokens(); i++) { newValue[i] = URLDecoder.decode(tokenizer.nextToken(), "UTF-8"); } return newValue; } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } }
javax.faces.convert.ConverterのgetAsObjectメソッドのJavaDocをみると
とあるからnullがきた場合の処理もあったほうがいいとおもうんだけどなー。
どうしよーと思って師匠に相談して、とりあえずnullがきても大丈夫なコンバーターをStringArrayConverterを継承して作成して回避できたのでまあいいんだけど。