今日のはまり。
Struts 2のvalidate アノテーションの問題。
RegexFieldValidatorが内部で勝手にトリムするから半角スペースが先頭や末尾にあるかの正規表現でチェックできなかった。
RegexFieldValidatorのソースを見ると勝手にトリムしている。
パラメタでトリムの実行有無を判定できないようにしているのは何かの理由があるのだろうか。
Struts 2のアノテーションが2つ利用できないのが残念。
正規表現は、「または」を用いるしかないのだろうか。
【後日談】
最終的にCustomValidatorを使ってValidateさせた。
RegexFieldValidatorクラス を extends して XxxxRegexFieldValidator クラスを作成した。
validateメソッドをOverrideした。
【ソース一部抜粋】
public class XxxxRegexFieldValidator extends RegexFieldValidator { private boolean doTrim = true; public void setTrim(boolean trim) { doTrim = trim; } public boolean getTrim() { return doTrim; } @Override public void validate(Object object) throws ValidationException { String fieldName = getFieldName(); Object value = this.getFieldValue(fieldName, object); if (value == null || getExpression() == null) { return; } if (!(value instanceof String)) { return; } String str = ((String) value).trim(); if (str.length() == 0) { return; } Pattern pattern; if (isCaseSensitive()) { pattern = Pattern.compile(getExpression()); } else { pattern = Pattern.compile(getExpression(), Pattern.CASE_INSENSITIVE); } String compare = (String) value; if ( doTrim ) { compare = compare.trim(); } Matcher matcher = pattern.matcher( compare ); if (!matcher.matches()) { addFieldError(fieldName, object); } } /** * doTrimを取得します。 * @return doTrim */ public boolean isDoTrim() { return doTrim; } /** * doTrimを設定します。 * @param doTrim doTrim */ public void setDoTrim(boolean doTrim) { this.doTrim = doTrim; }
【validators.xml】
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator Config 1.0//EN" "http://struts.apache.org/dtds/xwork-validator-config-1.0.dtd"> <validators> <validator name="xxxxregex" class="jp.arison.validator.validators.XxxxRegexFieldValidator"/> </validators>
【使用方法 一部抜粋】
public class AriModel { /** ID */ private String id; public String getId() { return id; } @RequiredStringValidator(message = "${getText('リソースキー',{getText('補間用のリソースキー')})}") @CustomValidator(type = "xxxxregex", key = "${getText('リソースキー')}", parameters = { @ValidationParameter(name = "trim", value = "false"), @ValidationParameter(name = "expression", value = "正規表現") }) public void setId(String id) { this.id = id; } }