カスタムバリデーター2 大勘違い
先日書いたExRegExprValidatorの国際化はユーザーに対しての国際化ではなくアプリケーションサーバーの実行環境に対しての国際化になっちゃってた。恥ずかしい〜(笑)。
後で書き直そう…。
書き直した。s2jsfのコンテナに予めrequestオブジェクトが用意されていてそれをsetterで取得。requestからロケール取得で出来た。楽だ。
package examples.jsf.validator; import java.text.MessageFormat; import java.util.Locale; import java.util.ResourceBundle; import javax.faces.application.FacesMessage; import javax.faces.component.StateHolder; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.validator.Validator; import javax.faces.validator.ValidatorException; import javax.servlet.http.HttpServletRequest; public class ExRegExprValidator implements Validator, StateHolder { private static final String BUNDLE_NAME = "Message"; //properties private HttpServletRequest request; private String messageId; private Object[] messageArgs; private String pattern; private boolean _transient = false; //getter setter public void setRequest(HttpServletRequest request) { this.request = request; } public String getMessageId() { return messageId; } public void setMessageId(String messageId) { this.messageId = messageId; } public Object[] getMessageArgs() { return messageArgs; } public void setMessageArgs(Object[] messageArgs) { this.messageArgs = messageArgs; } public String getPattern() { return pattern; } public void setPattern(String pattern) { this.pattern = pattern; } public boolean isTransient() { return _transient; } public void setTransient(boolean newTransientValue) { _transient = newTransientValue; } //method public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { if (context == null) throw new NullPointerException("FacesContext"); if (component == null) throw new NullPointerException("UIComponent"); if (value == null) return; String text = value.toString(); if (!text.matches(pattern)) { throw new ValidatorException(new FacesMessage(getResourceMessage())); } } private String getResourceMessage() { //locale from browser. Locale locale = request.getLocale(); if (locale == null) { locale = Locale.ENGLISH; } ResourceBundle bundle = ResourceBundle.getBundle(BUNDLE_NAME, locale); String mId = bundle.getString(messageId); Object[] mArgs = new Object[messageArgs.length]; for (int i = 0; i < messageArgs.length; i++) { mArgs[i] = bundle.getString(messageArgs[i].toString()); } return MessageFormat.format(mId, mArgs); } public Object saveState(FacesContext context) { Object values[] = new Object[3]; values[0] = pattern; values[1] = messageId; values[2] = messageArgs; return values; } public void restoreState(FacesContext context, Object state) { Object values[] = (Object[]) state; pattern = values[0].toString(); messageId = values[1].toString(); messageArgs = (Object[]) values[2]; } }