2016-12-12 9 views
0

Google AutoValueを広く使用してJavaBeanの規則に従わない値クラスを作成するコードベースがあります。 e。 getFoo()の代わりに、対応する方法は単にfoo()と名付けられます。残念ながら、Hibernate Validatorは、JavaBeanのゲッターやクラスプロパティをそのまま検証するため、AutoValueクラスの検証は暗黙的に失敗します。Hibernate ValidatorでJavaBean規則なしでPOJOを検証する

にはどうすれば(すなわちgetset、およびis/has接頭辞を使用して)JavaBeanの規則に準拠していないPOJOを検証するためにHibernate Validatorをカスタマイズすることができますか?

例:今はできません

HibernateValidatorAutoValueTest.java

import com.google.auto.value.AutoValue; 
import org.hibernate.validator.constraints.NotBlank; 
import org.junit.Test; 

import javax.validation.Validation; 
import javax.validation.Validator; 
import javax.validation.ValidatorFactory; 
import javax.validation.constraints.Min; 
import javax.validation.constraints.NotNull; 

import static org.junit.Assert.assertFalse; 
import static org.junit.Assert.assertTrue; 

public class HibernateValidatorAutoValueTest { 
    @Test 
    public void test() { 
     final ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
     final Validator validator = factory.getValidator(); 

     final Bean validBean = Bean.create("Valid", 100); 
     assertTrue("Valid bean should not have constraint violations", validator.validate(validBean).isEmpty()); 

     final Bean invalidBean = Bean.create("", -1); 
     assertFalse("Invalid bean should have constraint violations", validator.validate(invalidBean).isEmpty()); 
    } 

    @AutoValue 
    public static abstract class Bean { 
     @NotBlank 
     public abstract String text(); 

     @NotNull 
     @Min(42L) 
     public abstract Integer number(); 

     public static Bean create(String text, Integer number) { 
      return new AutoValue_HibernateValidatorAutoValueTest_Bean(text, number); 
     } 
    } 
} 

のpom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <prerequisites> 
     <maven>3.0.1</maven> 
    </prerequisites> 

    <groupId>org.example</groupId> 
    <artifactId>hibernate-validator-auto-value</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <maven.compiler.source>1.8</maven.compiler.source> 
     <maven.compiler.target>1.8</maven.compiler.target> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
      <version>5.3.4.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.el</groupId> 
      <artifactId>javax.el-api</artifactId> 
      <version>3.0.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.web</groupId> 
      <artifactId>javax.el</artifactId> 
      <version>2.2.6</version> 
     </dependency> 
     <dependency> 
      <groupId>com.google.auto.value</groupId> 
      <artifactId>auto-value</artifactId> 
      <version>1.3</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.12</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
</project> 

答えて

1

、ビーン検証は本当にJavaBeansの中心とされます。ご希望の場合は、JIRAに問題を提出してください。リファレンス実装でそれを調べることができますが、これにはかなりの変更が必要です。

可能な回避策の1つは、制約宣言にXMLまたはHVプログラムAPIを使用して、これらの型の生成された実装のフィールドに制約を適用することです。これは、getterアクセス​​に対するフィールドアクセスを意味しますが、もちろん、自動値型のgetter定義に直接制約を置くほど簡潔ではありません。

+0

バマーですが、本当にありがとうございます! – joschi

関連する問題