2014-01-20 67 views
0

存在以下类,该类由预定义的UUID组成,该UUID描述数据库的可能实例。运行时的Java注释

public class Predefined { 
    @NotNull 
    @Size(min = 1, max = 25) 
    public UUID phone = UUID.fromString("47b58767-c0ad-43fe-8e87-c7dae489a4f0"); 

    @NotNull 
    @Size(min = 1, max = 40) 
    public UUID company = UUID.fromString("f9a1e8f4-b8c0-41f2-a626-49c11da8d5c2"); 
} 

这些值被接收为一个密钥对值槽web服务:然后将它们付诸HashMap中。

47b58767-c0ad-43fe-8e87-c7dae489a4f0 = 00112233445566778899

f9a1e8f4-b8c0-41f2-a626-49c11da8d5c2 = someVirtualCompnayName

当我收到的UUID我知道我创造的一个实例预定义的类,然后得到的在预定义类,即提出的注解:

Annotation[] annon = field.getDeclaredAnnotations(); 

现在我需要检查这些注释agains,我从网络服务得到了值,即“00112233445566778899”和“一些VirtualCompnayName“在运行时

这可能吗? 我是例如覆盖JSR 303

中特别有趣,不久,为什么我有这样的结构: 的DAO,@Repository类有不同的结构,即

接触

contact_attrbute

contact_attibute_type

其中databse“contact_attibute_type”是指“公司”和“电话”。第二个表,即“contact_attrbute”意味着“公司”和“电话”的实际值。

现在,我需要一种方法来验证这些值,然后再将它们写入休眠状态,因此我得到“public UUID phone”,然后尝试将这些约束应用于从用户获得的实际值,即“+00112233445566778899 ”。

回答

1

我会发布完整的代码,我拿出来验证你的测试用例(包括简单的可执行演示):

注释:

package annotations; 

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

@Target({ElementType.FIELD }) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface NotNull 
{ 

} 

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

@Target({ElementType.FIELD }) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Size 
{ 
    int min() default 0; 
    int max(); 
} 

预定义类:

public class Predefined 
{ 
    @NotNull 
    @Size(min = 1, max = 25) 
    public UUID phone; 

    @NotNull 
    @Size(min = 1, max = 40) 
    public UUID company; 

    public Predefined(UUID phone, UUID company) 
    { 
     this.phone = phone; 
     this.company = company; 
    } 
} 

迭代通过声明字段并检查其注释和字段/值映射的验证程序类:

public class PredefinedValidator 
{ 
    public boolean validate(Predefined predefined, Map<UUID, String> mappings) 
    { 
     if (predefined == null) 
      return false; 

     for (Field field :predefined.getClass().getDeclaredFields()) 
     { 
      if (field.getType().equals(UUID.class)) 
      { 
       try 
       { 
        Annotation[] annotations = field.getDeclaredAnnotations(); 
        UUID uuid = (UUID)field.get(predefined); 
        if (!this.validateField(uuid, annotations, mappings)) 
         return false; 
       } 
       catch (IllegalArgumentException | IllegalAccessException ex) 
       { 
        Logger.getLogger(PredefinedValidator.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     } 
     return true; 
    } 

    private boolean validateField(UUID field, Annotation[] annotations, Map<UUID, String> mapping) 
    { 
     boolean containsSize = false; 
     boolean containsNotNull = false; 
     int minSize = -1; 
     int maxSize = -1; 

     // fetch which annotations are available for the provided field 
     for (Annotation annotation : annotations) 
     { 
      if (annotation instanceof Size) 
      { 
       containsSize = true; 
       Size size = (Size)annotation; 
       minSize = size.min(); 
       maxSize = size.max(); 
      } 
      else if (annotation instanceof NotNull) 
       containsNotNull = true; 
     } 

     // check if the provided value is null and an annotatition for @NotNull 
     // is set 
     if (field == null && containsNotNull) 
      return false; 

     if (containsSize) 
     { 
      // get the value of the mapped UUID which we are going to validate 
      String value = mapping.get(field); 
      if (value == null && containsNotNull) 
       return false; 
      else if (value == null) 
       return true; 

      // check if the length of the value matches 
      if (value.length() <= minSize || value.length() >= maxSize) 
       return false; 
     } 

     // passed all tests 
     return true; 
    } 
} 

最后但并非最不重要一个简单的演示:

public static void main(String ... args) 
{ 
    Map<UUID, String> mappings = new HashMap<>(); 
    mappings.put(UUID.fromString("47b58767-c0ad-43fe-8e87-c7dae489a4f0"), "+00112233445566778899"); 
    mappings.put(UUID.fromString("f9a1e8f4-b8c0-41f2-a626-49c11da8d5c2"), "someVirtualCompnayName");  

    Predefined predefined = new Predefined(
      UUID.fromString("47b58767-c0ad-43fe-8e87-c7dae489a4f0"), 
      UUID.fromString("f9a1e8f4-b8c0-41f2-a626-49c11da8d5c2")); 
    Predefined predefined2 = new Predefined(
      UUID.randomUUID(), 
      UUID.fromString("f9a1e8f4-b8c0-41f2-a626-49c11da8d5c2")); 
    Predefined predefined3 = new Predefined(
      null, 
      UUID.fromString("f9a1e8f4-b8c0-41f2-a626-49c11da8d5c2")); 
    PredefinedValidator validator = new PredefinedValidator(); 

    System.out.println("predefined is valid: "+validator.validate(predefined, mappings)); 
    System.out.println("predefined is valid: "+validator.validate(predefined2, mappings)); 
    System.out.println("predefined is valid: "+validator.validate(predefined3, mappings)); 

    mappings.put(UUID.fromString("f9a1e8f4-b8c0-41f2-a626-49c11da8d5c2"), "someVirtualCompnayNamesomeVirtualCompnayNamesomeVirtualCompnayNamesomeVirtualCompnayName"); 
    System.out.println("predefined is valid: "+validator.validate(predefined, mappings)); 
} 

HTH

+0

您好罗马,Sincerer “丹科舍恩” 和 “мерси” 的重播。答案超出了我的想法。再次谢谢你。 – Tito

+0

@Tito无需感谢。 SO维护一个基于投票的系统,如果答案解决了您的问题,则接受答案作为解决方案。如果您同意某篇文章的内容,可以对答案进行投票。如果您不同意,请对该帖子发表评论并讨论您的发言,如果您认为答案根本无法解决问题或者缺乏有关如何处理原始问题的任何适当提示 –