arison.jp arison.jp blog - 現在をたのしく、未来をたのしむ。日常の思い出兼備忘録。

【Java】Struts2 RegexFieldValidator トリム事件

今日のはまり。

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;
	}

}

About arison

大都会岡山の南部にある玉野市生まれ。 大都会岡山のIT会社(目標は大都会No.1)でコンピュータとお客を相手に日夜格闘中。 関東出張中はグルメブログ。 基本的に遊び人のおっさん。 ライフハックとガンダム好き。ギガフロート玉野を浸透中。

11. 5月 2012 by arison
Categories: 日記, プログラミング | Tags: , | Leave a comment

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください