2014-01-20 16 views
0

существует следующий класс, который состоит из предопределенных UUID, которые описывают возможный доступ к базе данных.Java Annotation at runtime

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"); 
} 

Эти значения принимаются в качестве ключевого значения пары корыта веб-службы: а затем они помещаются в HashMap.

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

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

Когда я получить UUID, что я знаю, я создаю экземпляр из Предопределенный класс, а затем получить аннотации поданных в предопределенном классе, а именно:

Annotation[] annon = field.getDeclaredAnnotations(); 

Теперь мне нужно, чтобы проверить эту аннотацию Agains ценности, которые я получил от веба-сервисов, то есть «+00112233445566778899» и «некоторые VirtualCompnayName "во время выполнения

Возможно ли это? Я особенно интересно в примере покрывающей JSR 303.

Вскоре, почему у меня такая конструкция: дао, @Repository классы имеют различную структуру т.е.

контакт

contact_attrbute

contact_attibute_type

где база данных «contact_attibute_type» предназначена для «компании» и «телефона». Вторая таблица, т. Е. «Contact_attrbute», предназначена для фактических значений «компания» и «телефон».

Теперь мне нужен способ проверить эти значения, прежде чем писать их в спящем режиме, таким образом, я получаю «общедоступный UUID-телефон», а затем пытаюсь применить эти ограничения к фактическому значению, которое я получил от пользователя, то есть «+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)); 
} 

НТН

+0

Здравствуйте Роман, искренний "Danke schön" и "мерси" для этого повтора. Ответ был за пределами того, что я надеялся получить. Еще раз спасибо. – Tito

+0

@ Тито не нужно благодарить. SO поддерживает систему, основанную на голосовании, если ответ разрешил ваш вопрос принять ответ в качестве решения.Если вы согласны с содержанием сообщения, голосуйте за ответ; если вы не согласны, прокомментируете сообщение и обсудите свои заявления и, возможно, проголосовали, если считаете, что ответ не решает проблему вообще или не имеет никакого правильного намека на то, как справиться с проблемой происхождения –