如何处理FacesConverter中的异常?

时间:2018-02-13 16:26:52

标签: validation jsf

当日期格式不正确时(例如,当我手动发布13,02,2018而不是13.02.2018以及其他不正确的日期,如13.02.999)时,应用程序崩溃。我该如何解决? (手动输入很重要,我不能禁用它。)

XHTML:

<rich:calendar enableManualInput="true" datePattern="dd.MM.yyyy"
    value="#{myBean.data.myDate}">
    <f:converter converterId="mydate"/>
</rich:calendar>

转换器:

@FacesConverter("mydate")
public class LocalDateConverter implements Converter {
    private static final DateTimeFormatter formatter;
    static {
        formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
        formatter.withLocale(new Locale("ru"));
    }
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        return LocalDate.parse(value, formatter); 
    }

    @Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (value == null) {
        return "";
    } else if (value instanceof LocalDate) {
        return ((LocalDate) value).format(formatter);
    } else if (value instanceof LocalDateTime) {
        return ((LocalDateTime) value).format(formatter);
    } else {
        throw new IllegalArgumentException("Value is not java.time.LocaleDate");
    }
}

3 个答案:

答案 0 :(得分:1)

转换器应该抛出ConverterException,其中可以包含FacesMessage。此消息可以显示在XHTML页面上,靠近使用<h:message for="inputComponentId"/>导致异常的输入组件。

问题出现在getAsObject方法中。在那里你应该抓住DateTimeParseException例外并抛出ConverterException

try {
  return LocalDate.parse(value, formatter);
}
catch (DateTimeParseException ex) {
  throw new ConverterException(new FacesMessage("Invalid date: " + value));
}

另见:

答案 1 :(得分:0)

你根本不需要转换器。只需在label组件中包含rich:calendar属性,让系统确定值是否正确。例如:

<h:outputLabel for="programStartDate" value="#{msg.programStartDate}" />
<rich:calendar id="programStartDate" value="#{program.programStartDate}"
    label="#{msg.programStartDate}" inputStyle="width: 100px;"
    datePattern="#{referenceData.defaultDatePattern}"
    timeZone="#{referenceData.timezone}"
    enableManualInput="true" popup="true" required="true" />

答案 2 :(得分:-2)

使用try catch并捕获异常,以便它不会崩溃但继续而不允许异常使程序崩溃

@FacesConverter("mydate")
public class LocalDateConverter implements Converter
{
    private static final DateTimeFormatter formatter;
    static {
        formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
        formatter.withLocale(new Locale("ru"));
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value)
    {
        return LocalDate.parse(value, formatter);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value)
    {
        try
        {
            if (value == null)
            {
                return "";
            }
            else if (value instanceof LocalDate) {
                return ((LocalDate)value).format(formatter);
            } else if (value instanceof LocalDateTime) {
                return ((LocalDateTime)value).format(formatter);
            } else {
                throw new IllegalArgumentException("Value is not java.time.LocaleDate");
            }
        }
        catch (Exception)
        {
            return "SOME DEFAULT DATE";
        }

    }
}