2017-01-09 2 views
1

에 필드 값을 사용하여 나는 기본 message()에서 다음 주석 클래스를자바 주석 : 다른 필드

public @interface Size { 
    int min() default 1; 
    int max() default 100; 
    String message() default "Age between min - max"; 
} 

다음 한 나는 min()max()의 기본 값을합니다. 단순히 String message() default "Age between" + min() + "-" + max();을 쓰는 것은 여기서 작동하지 않습니다. 직접 할 수있는 방법이 있습니까?

편집 1 : 나는 여기에 min()max() 값을 설정할 수 있습니다, 너무

public class Person { 

    @Size(max = 10) 
    private String name; 

    @Size(min = 18, message = "Age can not be less than {min}") 
    private int age; 

    public Person(String s, int i) { 
    this.name = s; 
    this.age = i; 
    } 
} 

이제 사람 클래스가 있습니다. 따라서 사용자가 잘못된 입력을하면 message()은 그에 따라 프린터가됩니다.

EDIT 2 : As @nicolas wanted. 여기에 입력을 확인하고 오류 메시지를 인쇄하는 AnnonatedValidator 클래스가 있습니다.

public class AnnotatedValidator { 

public static void validate(Person p, List<ValidationError> errors) { 

    try { 
     Field[] fields = p.getClass().getDeclaredFields(); 
     for(Field field : fields) { 
      if(field.getType().equals(String.class)){ 
       field.setAccessible(true); 
       String string = (String)field.get(p); 

       Annotation[] annotationsName = field.getDeclaredAnnotations(); 
       for (Annotation annotation : annotationsName){ 
        if (annotation instanceof Size){ 
         Size size = (Size) annotation; 
         if (string.length() < size.min() || string.length() > size.max()) { 
          error(size, errors); 
         } 
        } 
       } 

      } else if (field.getType().equals(int.class)) { 
       field.setAccessible(true); 
       int integer = (Integer)field.get(p); 

       Annotation[] annotationsAge = field.getDeclaredAnnotations(); 
       for (Annotation annotation : annotationsAge){ 
        if (annotation instanceof Size){ 
         Size size = (Size) annotation; 
         if (integer < size.min() || integer > size.max()) { 
          error(size,errors); 
         } 
        } 
       } 
      } 
     } 

    }catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
} 

public static void print(List<ValidationError> errors) { 
    for (int i = 0; i < errors.size(); i++){ 
     System.out.println("Errors: " + errors.get(i).getError()); 
    } 
} 

public static void error (Size size, List<ValidationError> errors) { 
    String error = size.message(); 
    if (!error.equals(null)) { 
     if (error.contains("min")) { 
      error = error.replace("min", ""+size.min()); 
     } 
     if (error.contains("max")){ 
      error = error.replace("max", ""+size.max()); 
     } 
    } 

    ValidationError v = new ValidationError(); 
    v.setError(error); 
    errors.add(v); 
} 
} 

ValidationError은 오류를 저장하는 또 다른 클래스입니다.

+1

주석 값이 상수를해야합니다, 당신은 분/최대 – AdamSkywalker

+1

오히려 상수 만이 기본값으로 예상되기 때문에 메시지를 인쇄 할 코드에서 관리해야 호출 할 수 없습니다 이미 –

+0

표시를 설명 예상 결과를 얻기 위해 입력을 향상시키고 자한다면 메시지를 표시하는 코드 –

답변

3

아니요, 유형의 경우 String 유형은 Java Language Specification dictates과 같이 상수 표현식이어야합니다.

요소 유형이 요소 값과 일치하지 않으면 인 경우 컴파일 타임 오류가 발생합니다.

  • [...]
  • T하지 어레이 타입, V 유형 인 것은 : 소자 형 T은 다음 중 하나에 해당하는 경우에만 경우 요소 값 V 상응 인 할당 호환 (§5.2) T으로하고 :
    • [...]
    • T가 기본 타입 또는 String 경우 t 암탉 V은 상수 표현입니다 (§15.28).

다른 주석 소자의 호출 일정한 표현이 아니다.

주석 처리를 관리하는 구성 요소에서이 작업을 처리해야합니다. default 메시지를 특별한 값으로 선언하십시오.

String message() default "REPLACE_ME"; 

그런 다음 메시지를 구성하는 동안이를 확인하십시오.예를 들어

Field field = ... // get 'age' field 
Size size = field.getAnnotation(Size.class); 
if (size != null) { 
    String message = size.message(); 
    if (message.equals("REPLACE_ME")) { 
     message = "Age between " + size.min() + " - " + size.max() + "."; 
    } 
} 
int min = size.min(); 
int max = size.max(); 
// if field is of type int 
int value = field.getInt(instance); 
if (value > max || value < min) { 
    throw new ConstraintViolationException(message); 
} 
+0

그래, 나는 또한 기본 메시지를 min() 및 max() 값으로 대체하여이 문제를 해결했습니다. @NicolasFilotto가 언급 한대로 동적으로 수행 할 수 있는지 궁금합니다. –