Search code examples
openapiopenapi-generatorjava-17

GenericSignatureFormatError when calling openapi-generated API


Problem

I have openapi (7.0.0) generated controllers and models running on Spring WebFlux server (5.x). Everything works locally, but when deploying to kubernetes pod, any PUT request fails (see stack trace below), while GET/DELETE call succeeds. GET returns a complex object, while the same complex object is used in PUT requests, so I suspect it is somehow related to the @RequestBody annotation.

Error stack trace

Caused by: java.lang.reflect.GenericSignatureFormatError: Signature Parse error: expected a class type
    Remaining input: java/lang/Object
    at java.base/sun.reflect.generics.parser.SignatureParser.error(Unknown Source)
    at java.base/sun.reflect.generics.parser.SignatureParser.parseClassTypeSignature(Unknown Source)
    at java.base/sun.reflect.generics.parser.SignatureParser.parseClassSignature(Unknown Source)
    at java.base/sun.reflect.generics.parser.SignatureParser.parseClassSig(Unknown Source)
    at java.base/sun.reflect.generics.repository.ClassRepository.parse(Unknown Source)
    at java.base/sun.reflect.generics.repository.ClassRepository.parse(Unknown Source)
    at java.base/sun.reflect.generics.repository.AbstractRepository.<init>(Unknown Source)
    at java.base/sun.reflect.generics.repository.GenericDeclRepository.<init>(Unknown Source)
    at java.base/sun.reflect.generics.repository.ClassRepository.<init>(Unknown Source)
    at java.base/sun.reflect.generics.repository.ClassRepository.make(Unknown Source)
    at java.base/java.lang.Class.getGenericInfo(Unknown Source)
    at java.base/java.lang.Class.getTypeParameters(Unknown Source)
    at java.base/sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.validateConstructorArguments(Unknown Source)
    at java.base/sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.<init>(Unknown Source)
    at java.base/sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.make(Unknown Source)
    at java.base/sun.reflect.generics.factory.CoreReflectionFactory.makeParameterizedType(Unknown Source)
    at java.base/sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Unknown Source)
    at java.base/sun.reflect.generics.tree.ClassTypeSignature.accept(Unknown Source)
    at java.base/sun.reflect.generics.repository.MethodRepository.computeReturnType(Unknown Source)
    at java.base/sun.reflect.generics.repository.MethodRepository.getReturnType(Unknown Source)
    at java.base/java.lang.reflect.Method.getGenericReturnType(Unknown Source)
    at org.hibernate.validator.internal.properties.javabean.JavaBeanMethod.<init>(JavaBeanMethod.java:20)
    at org.hibernate.validator.internal.properties.javabean.JavaBeanHelper.executable(JavaBeanHelper.java:132)
    at org.hibernate.validator.internal.properties.javabean.JavaBeanHelper.executable(JavaBeanHelper.java:120)
    at org.hibernate.validator.internal.properties.javabean.JavaBeanHelper.executable(JavaBeanHelper.java:112)
    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.findExecutableMetaData(AnnotationMetaDataProvider.java:307)
    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.getMetaData(AnnotationMetaDataProvider.java:292)
    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.getMethodMetaData(AnnotationMetaDataProvider.java:279)
    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.retrieveBeanConfiguration(AnnotationMetaDataProvider.java:130)
    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.getBeanConfiguration(AnnotationMetaDataProvider.java:120)
    at org.hibernate.validator.internal.metadata.BeanMetaDataManagerImpl.getBeanConfigurationForHierarchy(BeanMetaDataManagerImpl.java:234)
    at org.hibernate.validator.internal.metadata.BeanMetaDataManagerImpl.createBeanMetaData(BeanMetaDataManagerImpl.java:201)
    at org.hibernate.validator.internal.metadata.BeanMetaDataManagerImpl.getBeanMetaData(BeanMetaDataManagerImpl.java:165)
    at org.hibernate.validator.internal.engine.ValidatorImpl.buildNewLocalExecutionContext(ValidatorImpl.java:772)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateCascadedAnnotatedObjectForCurrentGroup(ValidatorImpl.java:627)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateCascadedConstraints(ValidatorImpl.java:590)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateParametersInContext(ValidatorImpl.java:880)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateParameters(ValidatorImpl.java:283)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateParameters(ValidatorImpl.java:235)
    at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:110)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)

Things I've tried

  1. Used openapi version 6.3.0 and 7.0.0.
  2. Triggered the PUT call on k8s pod directly and reproduced the same issue, confirmed this issue is not related to LB/proxy
  3. Downloaded the JAR on the pod to my local environment, and tried to run with the exact same JVM args and JDK version (JDK 17.0.4.1), local run was able to call PUT successfully

Solution

  • I was able to resolve this issue by upgrading from JDK 17.0.4.1 to JDK 17.0.6. Looks like this was a JDK bug which was fixed in 17.0.5: https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8282241