ScalaでDDDを実践する④ Lift+BeanValidation(JSR-303)編


ScalaでDDDを実践する①
ScalaでDDDを実践する②
ScalaでDDDを実践する③ Lift+Mybatis編

今回はLiftでBeanValidationやります。

LiftのValidationの機能はMapperに依存していて、Mapperなしでは使用できません。

その代わりにBeanValidationを選択してみました。

前回同様『project/build/プロジェクト名.scala』を以下のようにして依存ファイルを拾ってきます。
[cc lang=”scala”]
import sbt._

class プロジェクト名(info: ProjectInfo) extends DefaultWebProject(info) {
 ・・・
val repo = “Java.net Repository” at “http://download.java.net/maven/2/”

override def libraryDependencies = Set(
・・・
“javax.validation” % “validation-api” % “1.0.0.GA”,
“org.hibernate” % “hibernate-validator” % “4.0.2.GA”,
“joda-time” % “joda-time” % “1.6”
) ++ super.libraryDependencies
}
[/cc]
編集できたら『sbt update』です。

使い方は以下のような感じで・・・
[cc lang=”scala”]
package code.model

import javax.validation.constraints.NotNull
import javax.validation.Valid

class Book(id:Int, name:BookName){
def this(id:Int)=this(id, null)

final val bookId = id

@NotNull
@Valid
var bookName = name
}
[/cc]

基本BeanValidationは1階層のクラスしか見てくれないので、多階層のValidationをする場合は『@Valid』を指定します。

[cc lang=”scala”]
package code.model

import javax.validation.constraints.NotNull
import org.hibernate.validator.constraints.NotEmpty

case class BookName(name:String) {

@NotNull
@NotEmpty
final val bookName = name
}
[/cc]

Validationの仕方は以下の通りです。
[cc lang=”scala”]
val validator = Validation.buildDefaultValidatorFactory.getValidator
val validations = asScalaSet[ConstraintViolation[Book]](validator.validate(book))
if(validations.size == 0){
// 正常
}else{
// validaionエラー
       validations foreach { validation => S.error(validation.asInstanceOf[ConstraintViolationImpl[Book]].getPropertyPath.toString) }
}
[/cc]
ポイントはvalidationのエラーはJavaのSetで返ってくるのでそれを『asScalaSet』でScalaのSetに変換できるところです。

コメントを残す

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