Whiteship's Note


Valang - CustomFunction



Valang이 제공하는 여러 Validation로직이 있지만 사용자가 직접 특정 로직을 구현하여 끼워넣을 수 있습니다.

AbstractFunction 을 상속하여 구현합니다.

제약사항으로 세 개의 인자(Functions[] functions, int line, int column)를 가지는 생성자를 만들어서 AbstractFunction 클레스를 생성할 때 사용할 수 있도록 super를 호출해야 합니다.

Spring MVC 9장에 나와있는 예제로 그다지 쓸만해 보이지는 않지만 입력받은 값의 case를 뒤바꿔서 검증을 하는 예제가 나옵니다.

import org.apache.commons.lang.WordUtils;

import org.springmodules.validation.valang.functions.AbstractFunction;

import org.springmodules.validation.valang.functions.Function;

 

public class AlterCaseFunction extends AbstractFunction {

       public AlterCaseFunction(Function[] functions, int line, int column) {

             super(functions, line, column);

             definedMinNumberOfArguments(1);

             definedMaxNumberOfArguments(1);

       }

 

       protected Object doGetResult(Object target) {

             String value = getArguments()[0].getResult(target).toString();

             return WordUtils.swapCase(value);

       }

}

이렇게 작성한 Function을 ValangValidatorFactoryBean에 등록하여 syntax에서 사용할 수 있습니다.

<bean id="caseSwappingValidator"

       class="org.springmodules.validation.ValangValidatorFactoryBean">

       <property name="syntax">

             <value>

                    <![CDATA[

{ name : alterCase(?) = 'sTEVEN' : 'Name must be Steven' }

]]>

             </value>

       </property>

       <property name="customFunctions">

             <map>

                    <entry key="alterCase"

       value="com.apress.expertspringmvc.validation.AlterCaseFunction" />

             </map>

       </property>

</bean>

흠... 그런데..API에서 ValangValidatorFactoryBean 이녀석이 사라졌습니다. 어디로 갔을런지;;

top

Write a comment.


Valang - syntex



기본 적인 syntex 예제 입니다.

{ location : ? is not blank : 'Location must be specified' : 'addressLocationEmpty' : ? }

1. validation syntex는 {와 } 사이에 들어가야 합니다.

2. 인자는 총 다섯 개가 올 수 있으며 : 로 구분합니다. 마지막 인자는 생략 가능합니다.
- 첫 번째 인자 : 검사할 객체의 프로퍼티
- 두 번째 인자 : 검사하는 로직
- 세 번째 인자 : default message
- 네 번째 인자 : 프로퍼티 파일의 에러코드
- 다섯 번째 인자 : 아규먼트

3. 프로퍼티를 가져오는 방법
- name
- address.location
- customers[0].name
- salesParameters[seasonStartDate]
위와 같이 다양한 벙법으로 가져 올 수 있으며 기본적으로 String 타입으로 가져옵니다. 이 때 []를 사용하면 그 안의 값은 Date 타입으로 인식합니다. 현재 시각을 나타내는 T 를 사용할 수 있습니다.
예) 입력한 시각이 현재 시각보다 앞서지 않도록 검증
{ order.timestamp : ? < [T] : '' : 'order.timestamp.in_past' }
예) 입력한 시각이 오늘이라는 시간대에 포함되는지 검증
{ order.timestamp : ? between [T<d] and [T>d] : '' : 'order.timestamp.not_today' : ? }

4. 로직을 작성할 때 사용할 수 있는 오퍼레이터들
- String 관련 오퍼레이터
사용자 삽입 이미지
사용자 삽입 이미지
- Date 관련 오퍼레이터
사용자 삽입 이미지
- Date Incremental operator
사용자 삽입 이미지
- Date Regural Expression
사용자 삽입 이미지
top

TAG Syntax, Valang

Write a comment.


Declarative Validators - Valang 사용하기



XML 설정파일로 Validation을 할 수 있습니다.


Jakarta Commons Validator또는 Valang(Validation language)을 사용하여 선언적으로 Validation을 할 수 있습니다. 여기서는 SpringMVC 9장에서 소개하고 있는 Valang을 살펴봅니다.

1. 필요한 jar파일
- Spring Modules

2. 사용법
- org.springmodules.validation.ValangValidatorFactoryBean 사용하여 validation bean만들기
- syntax 등록
- custom function 등록
- Validation사용할 수 있는 Controller에 Setter Injection 시키면 끝!

3. 예제코드

<bean id="caseSwappingValidator"

       class="org.springmodules.validation.ValangValidatorFactoryBean">

       <property name="syntax">

             <value>

                    <![CDATA[

{ name : alterCase(?) = 'sTEVEN' : 'Name must be Steven' }

]]>

             </value>

       </property>

       <property name="customFunctions">

             <map>

                    <entry key="alterCase"

       value="com.apress.expertspringmvc.validation.AlterCaseFunction" />

             </map>

       </property>

</bean>


top

Write a comment.