IEのう○こめっ!

MyFaces の x:calendar がかっちょいーと思って使ってみました。で、1ページにこれが2つあったときの挙動なのですが、IE だと落ちます。なぜかというと、操作されてないほうの x:calendar の JavaScript が、デフォルトコンバータに文字列で「null」と渡しちゃうもんだから、デフォルトのコンバータをそんなの Date じゃねぇ! と言うわけですな。これ発見するのに苦労したなぁ。

で、解決法は、Converter を自分で書くしかなさそう。っていうか書いたら成功した。中身は文字列の「null」がきたら無視するようにすること。だいたい↓こんな感じ。

package hogehoge;

import java.text.DateFormat;
import java.text.ParseException;

import java.util.Date;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;

public class CalendarConverter implements Converter {
    public Object getAsObject(
        final FacesContext context, final UIComponent component,
        final String value) {
        DateFormat df = DateFormat.getDateInstance();

        if ((value != null) && !value.equals("") && !value.equals("null")) {
            try {
                return df.parse(value);
            } catch (ParseException e) {
                throw new ConverterException("Invalid Format : " + value, e);
            }
        }

        return null;
    }

    public String getAsString(
        final FacesContext context, final UIComponent component,
        final Object value) {
        DateFormat df = DateFormat.getDateInstance();

        if (!(value instanceof Date)) {
            throw new ConverterException(
                "Invalid class : " + value.getClass().getName());
        }

        return df.format(value);
    }
}