-
Bug
-
Resolution: Not an Issue
-
P3
-
None
-
14, 15
-
b27
ADDITIONAL SYSTEM INFORMATION :
% java -version
openjdk version "14.0.1" 2020-04-14
OpenJDK Runtime Environment AdoptOpenJDK (build 14.0.1+7)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 14.0.1+7, mixed mode, sharing)
% sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.4
BuildVersion: 19E287
A DESCRIPTION OF THE PROBLEM :
Constructor.getAnnotationParameters() being used for a Record completly ignores and does not return annotations with @Target(ElementType.FIELD).
That lead to potential problems with using a 3rd party libraries, like Jackson. As an example due to this issue record components annotated with @JsonIgnore(https://fasterxml.github.io/jackson-annotations/javadoc/2.5/com/fasterxml/jackson/annotation/JsonIgnore.html) can't be properly ignored.
REGRESSION : Last worked in version 14ea
---------- BEGIN SOURCE ----------
public class RecordAnnotationsTest {
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface A {
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface B {
}
public static class Foo {
public Foo( @A String message ) {
}
}
public record Bar (@A String message) {}
public record Baz (@B String message) {}
@Test
public void ensureThatGetParameterAnnotationsWorksForRecordProperly () {
Constructor<?>[] csFoo = Foo.class.getConstructors();
Constructor<?> cFoo = csFoo[0];
Annotation[][] paFoo = cFoo.getParameterAnnotations();
Constructor<?>[] csBar = Bar.class.getConstructors();
Constructor<?> cBar = csBar[0];
Annotation[][] paBar = cBar.getParameterAnnotations();
Assert.assertEquals( paFoo[0].length, paBar[0].length);
Constructor<?>[] csBaz = Baz.class.getConstructors();
Constructor<?> cBaz = csBaz[0];
Annotation[][] paBaz = cBaz.getParameterAnnotations();
Assert.assertEquals("ElementType.FIELD should be considered for records", paBar[0].length, paBaz[0].length);
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Considering the follwing two facts:
(1) Record components in the same time are:
- constructor parameters, in accordance to the declaration;
- fields, by the nature and observable behavior.
(2) Since the code from provided test case is legitimate and it does not produce compilation errors, compiler allows usage of @Target(ElementType.FIELD) and @Target(ElementType.PARAMETER) for record components.
As workaround it should be enough to return annotations with @Target(ElementType.FIELD).
FREQUENCY : always
% java -version
openjdk version "14.0.1" 2020-04-14
OpenJDK Runtime Environment AdoptOpenJDK (build 14.0.1+7)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 14.0.1+7, mixed mode, sharing)
% sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.4
BuildVersion: 19E287
A DESCRIPTION OF THE PROBLEM :
Constructor.getAnnotationParameters() being used for a Record completly ignores and does not return annotations with @Target(ElementType.FIELD).
That lead to potential problems with using a 3rd party libraries, like Jackson. As an example due to this issue record components annotated with @JsonIgnore(https://fasterxml.github.io/jackson-annotations/javadoc/2.5/com/fasterxml/jackson/annotation/JsonIgnore.html) can't be properly ignored.
REGRESSION : Last worked in version 14ea
---------- BEGIN SOURCE ----------
public class RecordAnnotationsTest {
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface A {
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface B {
}
public static class Foo {
public Foo( @A String message ) {
}
}
public record Bar (@A String message) {}
public record Baz (@B String message) {}
@Test
public void ensureThatGetParameterAnnotationsWorksForRecordProperly () {
Constructor<?>[] csFoo = Foo.class.getConstructors();
Constructor<?> cFoo = csFoo[0];
Annotation[][] paFoo = cFoo.getParameterAnnotations();
Constructor<?>[] csBar = Bar.class.getConstructors();
Constructor<?> cBar = csBar[0];
Annotation[][] paBar = cBar.getParameterAnnotations();
Assert.assertEquals( paFoo[0].length, paBar[0].length);
Constructor<?>[] csBaz = Baz.class.getConstructors();
Constructor<?> cBaz = csBaz[0];
Annotation[][] paBaz = cBaz.getParameterAnnotations();
Assert.assertEquals("ElementType.FIELD should be considered for records", paBar[0].length, paBaz[0].length);
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Considering the follwing two facts:
(1) Record components in the same time are:
- constructor parameters, in accordance to the declaration;
- fields, by the nature and observable behavior.
(2) Since the code from provided test case is legitimate and it does not produce compilation errors, compiler allows usage of @Target(ElementType.FIELD) and @Target(ElementType.PARAMETER) for record components.
As workaround it should be enough to return annotations with @Target(ElementType.FIELD).
FREQUENCY : always