LANGUAGE/!$%!% ERROR NOTE 2017. 2. 18. 12:17

Groovy

Bug Report

1. Error - 오류

\\some\\project\\TestAnnotationValue_Groovy.groovy: -1: Attribute 'shortProp2' should have type 'java.lang.Short'; but found type 'java.lang.Integer' in @test.bug.annotation.TestAnnotation

이전 1.8.3 버전에서는 Annotation Interface를 정의 할 때 문제가 발생했었는데

이번에는 Annotation을 사용하고 거기에 short값을 정의 할 때 문제가 발생한다.

@SomeAnnotation(shortProp = SomeCode.SHORT_VALUE)

short 값이 정의된 static 변수나 Enum의 값으로 정의하는 방법은 2.5.3 까지 작동했으나

Test해 본 결과, 2.5.4 버전부터 오류가 발생하는 것으로 보인다. ㅠ_ㅠ

  • 동작하는 버전

    • Groovy 2.1.3 부터 2.5.3 까지 (tested by 2.1.3 / 2.4.13 / 2.5.3)
  • 동작하지 않는 버전

    • Groovy 2.5.4 부터 (tested by 2.5.4* / 2.5.14 / 3.0.8)

참고로 다음 처럼 직접 숫자를 명시하는 건 애초에 안되었던 것 같다.

@SomeAnnotation(shortProp = 123)

2. Problem - 문제

버그 같다. 또는 지원하지 않을 것 같다.

3. Not Solved - 미해결

short을 사용하지 않고 int로 우회해서 사용해야 할 것 같다.

개인적으로 이건 꼭 개선되었으면 해서 Groovy Jira에 찾아가서 report를 남겼다.

Test Code

Groovy 개발자님들이 해결해주시길 간절하게 바라며..

Test Code를 작성해보았다.

/**
 * 1. Create some annotation.
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {

    short shortProp1() default (short) -1;
    short shortProp2() default (short) -1;

    int intProp1() default -1;
    int intProp2() default -1;

    long longProp1() default -1L;
    long longProp2() default -1L;

    boolean booleanProp() default false;

}
/**
 * 2. Create code values for annotation.
 */
public interface TestCode {

    public final static short SHORT_0 = 0;

    public final static short SHORT_1 = 0;

    public final static int INT_0 = 0;

    public final static int INT_1 = 1;

    public final static long LONG_0 = 0L;

    public final static long LONG_1 = 1L;

}
/**
 * 3-1. It all works on Java class
 */
@TestAnnotation(
    intProp1 = 1,
    intProp2 = TestCode.INT_1,
    longProp1 = 1L,
    longProp2 = TestCode.LONG_1,
    shortProp1 = 1,
    shortProp2 = TestCode.SHORT_1
)
class TestAnnotationValue_Java {

    Integer objectId;

}
/**
 * 3-2. 'int' and 'long' works on all version of groovy
 *      But 'short' does not works on some groovy version.
 */
@TestAnnotation(
    intProp1 = 1,
    intProp2 = TestCode.INT_1,
    longProp1 = 1L,
    longProp2 = TestCode.LONG_1,

    /**
     * [Defining directly] It always does not works on groovy class
     **/
//  shortProp1 = 1,

    /**
     * [Defining as an already defined variable] It works on Groovy between 2.1.3 and 2.5.3 (tested by 2.1.3 / 2.4.13 / 2.5.3)
     * But, It does not works since Groovy 2.5.4. (tested by 2.5.4 / 2.5.14 / 3.0.8)
     **/
    shortProp2 = TestCode.SHORT_1
)
class TestAnnotationValue_Groovy {

    Integer objectId

}

4. Reference - 참조