Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

Jakarta commons Validatorを用いた、複数項目の妥当性チェックについて

 表題の通り、Jakarta commons Validator を用いた妥当性チェックを
作成しています。ただし、Strutsを用いるのではなく、サーブレットで
実装しています。


【目的】
1. 開始日、終了日、日付形式 の妥当性チェックを行う。
2. 日付形式に設定された形式にて、開始日・終了日は設定される。
 (日付形式が yyyy の場合、開始日・終了日は 2006、2007 という情報で
 なければならない。200708(yyyyMM)では NG。)
3. 日付形式が、Javaの日付書式に従っているかのチェックを行う。(yyyyMMdd 等)
4. 指定方法として、日付形式+開始日、日付形式+開始日+終了日、
 全項目未入力 の場合のみ、入力OKとする。(日付形式+終了日、開始日のみ はNG)

【疑問点・問題点】
1. Validator の仕様には、日付チェックの場合(depends = "date")、
 var属性に対象の日付型(yyyyMMdd等)を指定するようになっているが、
 入力した日付形式がOKかどうか ということは実装できるのか?

2. Struts の Validator サンプルで、<var-value> 〜 </var-value>の中で
 指定できる and, or 指定は2つまで というのを http://www.techscore.com/tech/ApacheJakarta/Struts/24.html
 で見ましたが、上記の仕様だと 実装できない?

3. 今のところ日付のチェックが yyyy で指定しても実装できてないので、
 上記仕様のスタートラインに立ててません。


【備考】
・開始日、終了日の大小チェックは、まだ入れてません。
・別項目で、必須チェックは確認できました。(depends = "required")
・commons-validator ver.1.1.4
・当初は、妥当性チェックを自前で作ってましたが、汎用性を考えて
 commons-validator に変更しようとしています。

 下記に、ソースを記載します。

(validation.xml)

<?xml version="1.0" encoding="UTF-8"?>

<form-validation>

    <global>
    
        <validator name = "datecheck"
                   classname = "dateValidator"
                   method = "validateDate"
                   methodParams = "java.lang.Object, org.apache.commons.validator.Field"
        />
        
    </global>
    
    <formset>
        <form name = "dateCheck">
        
            <field property = "format"
                   depends = "validwhen">
                <arg0 key = "format" />
                <var>
                    <var-name>test</var-name>
                    <var-value>( ((startDate != null) and (*this* != null)) or
                                 ((startDate != null) and (endDate != null) and (*this* != null)) or
                                 ((startDate == null) and (endDate == null) and (*this* == null)) )
                    </var-value>
                </var>
            </field>
            
            <field property = "startDate"
                   depends = "validwhen, date">
                <arg0 key = "startDate" resource = "true" />
                <var>
                    <var-name>test</var-name>
                    <var-value>( ((*this* != null) and (format != null)) or
                                 ((*this* != null) and (endDate != null) and (format != null)) or
                                 ((*this* == null) and (endDate == null) and (format == null)) or
                                 format )
                    </var-value>
                </var>
            </field>
            
            <!-- テストで、yyyyが入力されたもの としてます。本来は、startDate と同じように属性指定します -->
            <field property = "endDate"
                    depends = "date">
                <arg0 key = "endDate" resource = "true" />
                <var>
                    <var-name>test</var-name>
                    <var-value>yyyy</var-value>
                </var>
            </field>
            
        </form>
    </formset>
    

</form-validation>


(dateValidator.java)

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Set;

import org.apache.commons.validator.Validator;
import org.apache.commons.validator.ValidatorAction;
import org.apache.commons.validator.ValidatorException;
import org.apache.commons.validator.ValidatorResources;
import org.apache.commons.validator.ValidatorResult;
import org.apache.commons.validator.ValidatorResults;
import org.xml.sax.SAXException;


public class dateValidator {
    
    private static ResourceBundle resourceProperties =
                   ResourceBundle.getBundle( "DateResources" );
    
    DateValidator() {
    }
    
    public void validateDate() {
        
        try {
        
            // Bean生成
            DateBean dateBean = new DateBean();
            
            // 値設定
            setBeans( dateBean );
            
            // 定義ファイル読込み
            InputStream[] is = new FileInputStream[2];
            
            // 任意のフォルダです。
            is[0] = new FileInputStream("C:\\resources\\validator-rules.xml");
            is[1] = new FileInputStream("C:\\resources\\validation.xml");
            
            ValidatorResults results = null;
            
            // XMLの定義内容を設定
            ValidatorResources resources = new ValidatorResources( is );
            
            // Validator の設定
            Validator          validator = new Validator( resources, "dateparameter" );
            
            // Beanの設定
            validator.setParameter( Validator.BEAN_PARAM, dateBean );
            
            // チェック
            results = validator.validate();
            
            // 妥当性検証結果
            Set propertyNames = results.getPropertyNames();
            
            // エラー結果設定リスト
            List errorList = new ArrayList();
            
            for( Object propertyName: propertyNames ) {
                
                ValidatorResult result = results.getValidatorResult( (String)propertyName );
                Map actionMap = result.getActionMap();
                Iterator actions = actionMap.keySet().iterator();
                
                while( actions.hasNext() ) {
                    
                    String actionName = (String)actions.next();
                    
                    if( !result.isValid(actionName) ) {
                        
                        // validateエラー判明
                        ValidatorAction action = resources.getValidatorAction( actionName );
                        
                        // DateResources.properties より、該当メッセージ取得
                        String message = resourceProperties.getString( action.getMsg() );
                        
                        // エラー情報をリストにセット
                        errorList.add( (String)propertyName );
                    }
                }
            }
            
            if( !errorList.isEmpty() ) {
                throw new IllegalArgumentException();
            }
            
        } catch( FileNotFoundException e ) {
            e.printStackTrace();    
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (ValidatorException e) {
            e.printStackTrace();
        }
        
        return;
    }
    
    
    private void setBeans( DateBean dateBean ) {
        
        // 以下、テストデータを Bean に設定しています
        
        dateBean.setFormat( "yyyy" );          // 日付形式
        dateBean.setStartDate( "2006" );       // 開始日
        dateBean.setEndDate( "2007" );         // 終了日
        
        return;
    }
}


(DateBean.java)

public class DateBean {
    
    private String format;             // 日付形式
    private String startDate;          // 開始日
    private String endDate;            // 終了日
    
    //-------------------------------------------------------------------------------------------
    // メソッド
    //-------------------------------------------------------------------------------------------
    public String getFormat() {
        return format;
    }
    
    public void setFormat( String format ) {
        this.format = format;
    }
    
    public String getStartDate() {
        return startDate;
    }
    
    public void setStartDate( String startDate ) {
        this.startDate = startDate;
    }
    
    public String getEndDate() {
        return endDate;
    }
    
    public void setEndDate( String endDate ) {
        this.endDate = endDate;
    }
}


 言葉足らずで申し訳ありませんが、どなたか
お力添え願います。

1

回答

5710

閲覧

1件の回答

評価

0

すみません、間違いに気づきました。dateルールの時は、
datePattern 要素か、datePatternStrict 要素を使うんですね。

(validation.xml 一部抜粋)

(変更前)

    <field property = "endDate"
            depends = "date">
        <arg0 key = "endDate" resource = "true" />
        <var>
            <var-name>test</var-name>
            <var-value>yyyy</var-value>
        </var>
    </field>

(変更後)

    <field property = "endDate"
            depends = "date">
        <var>
            <var-name>datePattern</var-name>
            <var-value>yyyy</var-value>
        </var>
    </field>


と、変えてみましたが、、、うまくいきません。

全て エラーで返ってきます。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。