I'm writing an E2E Test for my REST-Application. So the test, that is located in the frontend, calls the deployed backend, this is working perfectly fine except for one tiny problem: When the readEntity Method on the received Response is called, an java.lang.ArrayStoreException occurs. My observations show that the Problem lies within a self written Constraint Annotation:
I've written my own Constraint-Annotation @Future for Bean-Validation, my POJO uses this Annotation to validate that a LocalDateTime is in the future. I've also provided two simple Interfaces, which are used as Validation-Groups:
public interface ExistingInstance extends Default {
}
and
public interface NewInstance extends Default {
}
When i use one of these Interfaces as a validation group in my custom Constraint Annotation like follows:
public class Book {
@Future(groups=NewInstance.class)
private LocalDateTime validFrom;
private LocalDateTime validTo;
// Getters & Setters...
}
I receive this Exception:
java.lang.ArrayStoreException
at sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:736) ~[?:1.8.0]
at sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:543) ~[?:1.8.0]
at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:367) ~[?:1.8.0]
at sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:298) ~[?:1.8.0]
at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:132) ~[?:1.8.0]
at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:84) ~[?:1.8.0]
at java.lang.reflect.AccessibleObject.getAnnotationsFromCache(AccessibleObject.java:313) ~[?:1.8.0]
at java.lang.reflect.Field.declaredAnnotations(Field.java:1167) ~[?:1.8.0]
at java.lang.reflect.Field.getDeclaredAnnotations(Field.java:1160) ~[?:1.8.0]
at com.fasterxml.jackson.databind.introspect.AnnotatedFieldCollector._findFields(AnnotatedFieldCollector.java:86) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.introspect.AnnotatedFieldCollector._findFields(AnnotatedFieldCollector.java:71) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.introspect.AnnotatedFieldCollector.collect(AnnotatedFieldCollector.java:48) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.introspect.AnnotatedFieldCollector.collectFields(AnnotatedFieldCollector.java:43) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.introspect.AnnotatedClass._fields(AnnotatedClass.java:371) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.introspect.AnnotatedClass.fields(AnnotatedClass.java:343) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._addFields(POJOPropertiesCollector.java:493) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collectAll(POJOPropertiesCollector.java:421) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getPropertyMap(POJOPropertiesCollector.java:386) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getProperties(POJOPropertiesCollector.java:233) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.introspect.BasicBeanDescription._properties(BasicBeanDescription.java:164) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.introspect.BasicBeanDescription.findProperties(BasicBeanDescription.java:239) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._findCreatorsFromProperties(BasicDeserializerFactory.java:328) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._constructDefaultValueInstantiator(BasicDeserializerFactory.java:272) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findValueInstantiator(BasicDeserializerFactory.java:223) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:261) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:150) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:414) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:349) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:558) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.createContextual(CollectionDeserializer.java:188) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.createContextual(CollectionDeserializer.java:28) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.DeserializationContext.handlePrimaryContextualization(DeserializationContext.java:765) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:535) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:293) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:591) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.ObjectReader._prefetchRootDeserializer(ObjectReader.java:2340) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.databind.ObjectReader.forType(ObjectReader.java:723) ~[jackson-databind-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:804) ~[jackson-jaxrs-base-2.12.1.jar:2.12.1]
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:233) ~[jersey-common-2.33.jar:?]
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:212) ~[jersey-common-2.33.jar:?]
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:132) ~[jersey-common-2.33.jar:?]
at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1072) ~[jersey-common-2.33.jar:?]
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:885) ~[jersey-common-2.33.jar:?]
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:845) ~[jersey-common-2.33.jar:?]
at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:340) ~[jersey-client-2.33.jar:?]
at org.glassfish.jersey.client.InboundJaxrsResponse$2.call(InboundJaxrsResponse.java:104) ~[jersey-client-2.33.jar:?]
at org.glassfish.jersey.internal.Errors.process(Errors.java:292) ~[jersey-common-2.33.jar:?]
at org.glassfish.jersey.internal.Errors.process(Errors.java:274) ~[jersey-common-2.33.jar:?]
at org.glassfish.jersey.internal.Errors.process(Errors.java:205) ~[jersey-common-2.33.jar:?]
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:365) ~[jersey-common-2.33.jar:?]
at org.glassfish.jersey.client.InboundJaxrsResponse.runInScopeIfPossible(InboundJaxrsResponse.java:244) ~[jersey-client-2.33.jar:?]
at org.glassfish.jersey.client.InboundJaxrsResponse.readEntity(InboundJaxrsResponse.java:101) ~[jersey-client-2.33.jar:?]
at my.package.structure.BookService.readEntityFromResponse(BookService.java:309) ~[classes/:?]
at my.package.structure.BookService.getBooks(BookService.java:95) ~[classes/:?]
at my.package.structure.BookServiceTest.getBooks_Test(BookServiceTest.java:43) ~[test-classes/:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:90) ~[?:1.8.0]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55) ~[?:1.8.0]
at java.lang.reflect.Method.invoke(Method.java:508) ~[?:1.8.0]
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:436) ~[org.junit.platform.commons_1.1.0.v20180327-1502.jar:1.1.0]
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115) ~[org.junit.jupiter.engine_5.1.0.v20180327-1502.jar:5.1.0]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:170) ~[org.junit.jupiter.engine_5.1.0.v20180327-1502.jar:5.1.0]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor$$Lambda$251.00000000111DDEC0.execute(Unknown Source) ~[?:?]
at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40) ~[org.junit.jupiter.engine_5.1.0.v20180327-1502.jar:5.1.0]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:166) ~[org.junit.jupiter.engine_5.1.0.v20180327-1502.jar:5.1.0]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:113) ~[org.junit.jupiter.engine_5.1.0.v20180327-1502.jar:5.1.0]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:58) ~[org.junit.jupiter.engine_5.1.0.v20180327-1502.jar:5.1.0]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$3(HierarchicalTestExecutor.java:112) ~[org.junit.platform.engine_1.1.0.v20180327-1502.jar:1.1.0]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor$$Lambda$143.0000000010F40750.execute(Unknown Source) ~[?:?]
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66) ~[org.junit.platform.engine_1.1.0.v20180327-1502.jar:1.1.0]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.executeRecursively(HierarchicalTestExecutor.java:108) ~[org.junit.platform.engine_1.1.0.v20180327-1502.jar:1.1.0]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.execute(HierarchicalTestExecutor.java:79) ~[org.junit.platform.engine_1.1.0.v20180327-1502.jar:1.1.0]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$2(HierarchicalTestExecutor.java:120) ~[org.junit.platform.engine_1.1.0.v20180327-1502.jar:1.1.0]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor$$Lambda$146.0000000010B0F760.accept(Unknown Source) ~[?:?]
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:195) ~[?:1.8.0]
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:186) ~[?:1.8.0]
at java.util.Iterator.forEachRemaining(Iterator.java:127) ~[?:1.8.0]
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1812) ~[?:1.8.0]
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:523) ~[?:1.8.0]
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:513) ~[?:1.8.0]
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:162) ~[?:1.8.0]
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:185) ~[?:1.8.0]
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:245) ~[?:1.8.0]
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:429) ~[?:1.8.0]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$3(HierarchicalTestExecutor.java:120) ~[org.junit.platform.engine_1.1.0.v20180327-1502.jar:1.1.0]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor$$Lambda$143.0000000010F40750.execute(Unknown Source) ~[?:?]
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66) ~[org.junit.platform.engine_1.1.0.v20180327-1502.jar:1.1.0]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.executeRecursively(HierarchicalTestExecutor.java:108) ~[org.junit.platform.engine_1.1.0.v20180327-1502.jar:1.1.0]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.execute(HierarchicalTestExecutor.java:79) ~[org.junit.platform.engine_1.1.0.v20180327-1502.jar:1.1.0]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$2(HierarchicalTestExecutor.java:120) ~[org.junit.platform.engine_1.1.0.v20180327-1502.jar:1.1.0]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor$$Lambda$146.0000000010B0F760.accept(Unknown Source) ~[?:?]
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:195) ~[?:1.8.0]
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:186) ~[?:1.8.0]
at java.util.Iterator.forEachRemaining(Iterator.java:127) ~[?:1.8.0]
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1812) ~[?:1.8.0]
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:523) ~[?:1.8.0]
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:513) ~[?:1.8.0]
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:162) ~[?:1.8.0]
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:185) ~[?:1.8.0]
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:245) ~[?:1.8.0]
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:429) ~[?:1.8.0]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$3(HierarchicalTestExecutor.java:120) ~[org.junit.platform.engine_1.1.0.v20180327-1502.jar:1.1.0]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor$$Lambda$143.0000000010F40750.execute(Unknown Source) ~[?:?]
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66) [org.junit.platform.engine_1.1.0.v20180327-1502.jar:1.1.0]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.executeRecursively(HierarchicalTestExecutor.java:108) [org.junit.platform.engine_1.1.0.v20180327-1502.jar:1.1.0]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.execute(HierarchicalTestExecutor.java:79) [org.junit.platform.engine_1.1.0.v20180327-1502.jar:1.1.0]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:55) [org.junit.platform.engine_1.1.0.v20180327-1502.jar:1.1.0]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:43) [org.junit.platform.engine_1.1.0.v20180327-1502.jar:1.1.0]
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170) [org.junit.platform.launcher_1.1.0.v20180327-1502.jar:1.1.0]
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154) [org.junit.platform.launcher_1.1.0.v20180327-1502.jar:1.1.0]
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90) [org.junit.platform.launcher_1.1.0.v20180327-1502.jar:1.1.0]
at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:86) [.cp/:?]
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) [.cp/:?]
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538) [.cp/:?]
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760) [.cp/:?]
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460) [.cp/:?]
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206) [.cp/:?]
Now the Confusing Part:
If i use my Validation-Group Interfaces on an Existing Annotation, provided by Java, like @NotNull:
public class Book {
@NotNull(groups=NewInstance.class)
private LocalDateTime validFrom;
private LocalDateTime validTo;
// Getters & Setters...
}
It works like perfectly fine. Even if i use a class provided in the JDK, like Default.class as a group on my Custom Annotation:
public class Book {
@NotNull(groups=Default.class)
private LocalDateTime validFrom;
private LocalDateTime validTo;
// Getters & Setters...
}
It works!
What am i missing?
I use:
- Java v8
- JavaEE v7
- Jersey Client v2.33
- Jersey HK2 v2.33
Note: I know that the Annotation `@Future` is already provided, but in Java 8 with JavaEE 7 it does not support the 'new' Time-API.
Aucun commentaire:
Enregistrer un commentaire