2016-10-28 11 views
2

========== UPDATEを取得することはできません:NOTNULL、@get:最小@get:Max、hibernate-validatorは、これらの注釈の成功を読み取ることができます。kotlin:私は@getする注釈を変更したとき==========</p> <p>を検証APIの注釈

しかし、私はまだ知りたいです:

JPAの注釈をすることができますが、なぜこのよう@NotNull、@Minと@Maxとして検証-APIの注釈は、直接データクラスのメンバーに使用することはできませんか? ???

==========ベローは、私は、データクラス上のバリデータを検証-APIのアノテーションを使用しようとした原点質問===========

ですclass(hibernate-validatorから)はアノテーションを取得できないため、検証は失敗しました。

  • 第一1つの使用JPA注釈@Columnと@Id、テストケースによって成功裏に読み取ることができます:

    iは3つのデータクラスを含めたテストケースを、書きました。
  • 第二1回の使用検証-APIの注釈@NotEmpty、ミン@、マックス@メンバーに、これらのアノテーションは、テストケースで読み取ることができません
  • 第三一回の使用検証-APIの注釈@get:NotEmpty、@get:最小、@ get:Max、テストケースはこれらの注釈を読み取ることができません。

@Column、@NotNull、@Minと@Maxの対象と保持が全てです:だから RUNTIMEとFIELD

、何が背後で起こったのか?検証アノテーションを正しく使用するにはどうすればよいですか?ここで

は、テストケースである:

import org.hibernate.validator.constraints.NotEmpty 
import org.junit.Test 
import javax.persistence.Column 
import javax.persistence.Id 
import javax.validation.constraints.Max 
import javax.validation.constraints.Min 
import kotlin.reflect.KFunction 
import kotlin.reflect.KProperty 
import kotlin.reflect.jvm.javaField 
import kotlin.reflect.jvm.javaMethod 

class KotlinFeatureTest2 { 
    @Test 
    fun test_get_annotation() { 
     // can get field's annotation for BeanUseJPAAnnotation success 
     println("Getting field annotations for BeanUseJPAAnnotation :") 
     BeanUseJPAAnnotation::class.members.forEach { 
      if (it is KProperty) { 
       val field = it.javaField 
       println("${field?.name}'s annotations:") 
       field?.annotations?.forEachIndexed { i, an -> 
        println("  $i is: $an") 
       } 
      } 
     } 

     println("--------------------") 
     println("Getting field annotations for BeanUseValidationAnnotation :") 
     // CANT get field's annotation for BeanUseJPAAnnotation success 
     BeanUseValidationAnnotation::class.members.forEach { 
      if (it is KProperty) { 
       val field = it.javaField 
       println("${field?.name}'s annotations:") 
       field?.annotations?.forEachIndexed { i, an -> 
        println("  $i is: $an") 
       } 
      } 
     } 

     println("--------------------") 
     println("Getting field annotations for BeanUseValidationAnnotationOnMethod :") 
     // CANT get field's annotation for BeanUseJPAAnnotation success 
     BeanUseValidationAnnotationOnMethod::class.members.forEach { 
      if (it is KFunction) { 
       val method = it.javaMethod 
       println("${method?.name}'s annotations: ") 
       method?.annotations?.forEachIndexed { i, an -> 
        println("  $i is: $an") 
       } 
      } 
     } 
    } 
} 

data class BeanUseJPAAnnotation(
     @Column(name = "id") @Id val id: String, 
     @Column(name = "user_name") val name: String) 

data class BeanUseValidationAnnotation(
     @NotEmpty(message = "name can not be empty") 
     val name: String, 

     @Min(value = 1) 
     @Max(value = 100) 
     val age: Int 
) 

data class BeanUseValidationAnnotationOnMethod(
     @get:NotEmpty(message = "name can not be empty") 
     val name: String, 

     @get:Min(value = 1) 
     @get:Max(value = 100) 
     val age: Int) 

、ここでは、このテストケースの出力れる:

Getting field annotations for BeanUseJPAAnnotation : 
id's annotations: 
    0 is: @javax.persistence.Column(nullable=true, unique=false, precision=0, name=id, length=255, scale=0, updatable=true, columnDefinition=, table=, insertable=true) 
    1 is: @javax.persistence.Id() 
name's annotations: 
    0 is: @javax.persistence.Column(nullable=true, unique=false, precision=0, name=user_name, length=255, scale=0, updatable=true, columnDefinition=, table=, insertable=true) 
-------------------- 
Getting field annotations for BeanUseValidationAnnotation : 
age's annotations: 
name's annotations: 
-------------------- 
Getting field annotations for BeanUseValidationAnnotationOnMethod : 
component1's annotations: 
component2's annotations: 
copy's annotations: 
equals's annotations: 
hashCode's annotations: 
toString's annotations: 
+0

UPDATE:私は、注釈を変更します"@get:NotNull"、 "@get:Min"、 "@get:Max"の場合、hibernate-validatorはこれらの注釈の成功を読み取ることができます。しかし、私がまだ知りたいことは、JPAのアノテーションはデータ型のメンバーに直接的には使用できないのに対して、なぜ@ @ NotNull、@Min、@Maxなどの検証APIのアノテーションは直接データクラスのメンバーに使用できないのです。 –

答えて

1

以下はjavax.persistence.Columnの署名の一部である:

@Target({METHOD, FIELD}) 
@Retention(RUNTIME) 
public @interface Column { 

これとは逆に、javax.validation.constraints.Minの部分と同じです:

あなたが見ることができるように
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) 
@Retention(RUNTIME) 
@Repeatable(List.class) 
@Documented 
@Constraint(validatedBy = { }) 
public @interface Min { 

は、JPA永続性注釈はKotlinがFIELDレベルでそれらを放出するので、METHODFIELDをターゲットにしています。しかし、バリデータのAPI注釈は、より多くの構文を対象としています。特に、PARAMETERです。与えられたコンストラクタで宣言されたプロパティの注釈を生成するとき、Kotlinコンパイラはパラメータにのみという注釈を付けることを選択します。この動作はin the documentationに記載されている

public BeanUseValidationAnnotation(@NotEmpty(message = "name can not be empty") @NotNull String name, @Min(1L) @Max(100L) int age) { 

:JavaでBeanUseValidationAnnotationコンストラクタ署名と同等のようになりますが、使用サイトのターゲットを指定しない場合

、ターゲットがへ 応じて選択されます@Target注釈の注釈が使用されています。 複数の適用対象がある場合は、 次のリストから、最初の適用対象が使用されます。

  • param
  • property
  • field
+0

あなたの大きな説明に感謝しています。 –