錯誤訊息處理


在使用標準轉換器或驗證器時,當發生錯誤時,會有一些預設的錯誤訊息顯示,這些訊息可以使用<h: messages>或<h:message>標籤來顯示出來,而這些預設的錯誤訊息也是可以修改的,您所要作的是提供一個訊息資源檔 案,例如:
  • messages.properties
javax.faces.component.UIInput.CONVERSION=Format Error.
javax.faces.component.UIInput.REQUIRED=Please input your data.
....

javax.faces.component.UIInput.CONVERSION是用來設定當轉換器發現錯誤時顯示的訊息,而 javax.faces.component.UIInput.REQUIRED是在標籤設定了required為true,而使用者沒有在欄位輸入時顯 示的錯誤訊息。

您要在faces-config.xml中告訴JSF您使用的訊息檔案名稱,例如:
  • faces-config.xml
<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
"http://java.sun.com/dtd/web-facesconfig_1_0.dtd">

<faces-config>
<application>
<local-config>
<default-locale>en</default-locale>
<supported-locale>zh_TW</supported-locale>
</local-config>
<message-bundle>messages</message-bundle>
</application>
.....

</faces-config>

在這邊我們設定了訊息檔案的名稱為messages_xx_YY.properties,其中xx_YY是根據您的Locale來決定,轉換器或驗證器的錯誤訊息如果有設定的話,就使用設定值,如果沒有設定的話,就使用預設值。

驗證器錯誤訊息,除了上面的javax.faces.component.UIInput.REQUIRED之外,還有以下的幾個:
訊息識別 預設訊息 用於
javax.faces.validator.NOT_IN_RANGE Validation Error: Specified attribute is not between the expected values of {0} and {1}. DoubleRangeValidator與 LongRangeValidator,{0}與{1}分別代表minimum與maximum所設定的屬性
javax.faces.validator.DoubleRangeValidator.MAXIMUM、 javax.faces.validator.LongRangeValidator.MAXIMUM Validation Error: Value is greater than allowable maximum of '{0}'. DoubleRangeValidator或 LongRangeValidator,{0}表示maximum屬性
javax.faces.validator.DoubleRangeValidator.MINIMUM、 javax.faces.validator.LongRangeValidator.MINIMUM Validation Error: Value is less than allowable minimum of '{0}'. DoubleRangeValidator或 LongRangeValidator,{0}代表minimum屬性
javax.faces.validator.DoubleRangeValidator.TYPE、 javax.faces.validator.LongRangeValidator.TYPE Validation Error: Value is not of the correct type. DoubleRangeValidator或 LongRangeValidator
javax.faces.validator.LengthValidator.MAXIMUM Validation Error: Value is greater than allowable maximum of ''{0}''. LengthValidator,{0}代表maximum
javax.faces.validator.LengthValidator.MINIMUM Validation Error: Value is less than allowable minimum of ''{0}''. LengthValidator,{0}代表minimum屬性

在您提供自訂訊息的時候,也可以提供{0}或{1}來設定顯示相對的屬性值,以提供詳細正確的錯誤提示訊息。

訊息的顯示有概述訊息與詳述訊息,如果是詳述訊息,則在識別上加上 "_detail",例如:

 javax.faces.component.UIInput.CONVERSION=Error.
 javax.faces.component.UIInput.CONVERSION_detail= Detail Error.
 .... 

除了在訊息資源檔中提供訊息,您也可以在程式中使用FacesMessage來提供訊息,例如在 自訂驗證器 中我們就這麼用過:

 ....
         if(password.length() < 6) {
            FacesMessage message = new FacesMessage(
                 FacesMessage.SEVERITY_ERROR,
                 "字元長度小於6",
                 "字元長度不得小於6");
            throw new ValidatorException(message);
        }
 ....
 

最好的方法是在訊息資源檔中提供訊息,這麼一來如果我們要修改訊息,就只要修改訊息資源檔的內容,而不用修改程式,來看一個簡單的例子,假設我們的訊息資源檔中有以下的內容: 

 onlyfun.caterpillar.message1=This is message1.
 onlyfun.caterpillar.message2=This is message2 with {0} and {1}.

 則我們可以在程式中取得訊息資源檔的內容,例如:

 package onlyfun.caterpillar;

 import java.util.Locale;
 import java.util.ResourceBundle;
 import javax.faces.context.FacesContext;
 improt javax.faces.component.UIComponent;
 import javax.faces.application.Application;
 import javax.faces.application.FacesMessage;
 
     ....
     public void xxxMethod(FacesContext context,
                          UIComponent component,
                          Object obj) {
         // 取得應用程式代表物件
         Application application = context.getApplication();
         // 取得訊息檔案主名稱
         String messageFileName =
                           application.getMessageBundle();
         // 取得當前 Locale 物件
         Locale locale = context.getViewRoot().getLocale();
         // 取得訊息綁定 ResourceBundle 物件
         ResourceBundle rsBundle =
           ResourceBundle.getBundle(messageFileName, locale);

         String message = rsBundle.getString(
                          "onlyfun.caterpillar.message1");
         FacesMessage facesMessage = new FacesMessage(
              FacesMessage.SEVERITY_FATAL, message, message);
         ....
     }
     ....
 ....

 
接下來您可以將FacesMessage物件填入ValidatorException或 ConverterException後再丟出,FacesMessage建構時所使用的三個參數是嚴重程度、概述訊息與詳述訊息,嚴重程度有 SEVERITY_FATAL、SEVERITY_ERROR、SEVERITY_WARN與SEVERITY_INFO四種。

如果需要在訊息資源檔中設定{0}、{1}等參數,則可以如下:

 ....
 String message = rsBundle.getString(
                      "onlyfun.caterpillar.message2");
 Object[] params = {"param1", "param2"};
 message = java.text.MessageFormat.format(message, params);

 FacesMessage facesMessage = new FacesMessage(
              FacesMessage.SEVERITY_FATAL, message, message);
....

 
如此一來,在顯示訊息時,onlyfun.caterpillar.message2的{0}與{1}的位置就會被"param1"與"param2"所取代。