Skip to content

GenericSignatureFormatError when using @Observes with Weld 3.1.2(CDI-2.0.SP1) #82

Description

@RussiaVk

Description

When using JSR-107 CDI annotations (@CacheResult, @CachePut, @CacheRemove, etc.) together with @observes on Weld 3.1.2.Final, the application fails to start with a GenericSignatureFormatError.

Expected Behavior

The application should start successfully and the JCache CDI interceptors should work normally.

Actual Behavior

Startup fails during Weld bean processing with the following exception:

Caused by: java.lang.reflect.GenericSignatureFormatError: Signature Parse error: Expected Field Type Signature
        Remaining input: javax.enterprise.event.TransactionPhase
                at java.base/sun.reflect.generics.parser.SignatureParser.error(SignatureParser.java:124)
                at java.base/sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:291)
                at java.base/sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:277)
                at java.base/sun.reflect.generics.parser.SignatureParser.parseTypeSignature(SignatureParser.java:469)
                at java.base/sun.reflect.generics.parser.SignatureParser.parseTypeSig(SignatureParser.java:188)
                at java.base/sun.reflect.annotation.AnnotationParser.parseSig(AnnotationParser.java:438)
                at java.base/sun.reflect.annotation.AnnotationParser.parseEnumValue(AnnotationParser.java:473)
                at java.base/sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:344)
                at java.base/sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:282)
                at java.base/sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:227)
                at java.base/sun.reflect.annotation.AnnotationParser.parseParameterAnnotations2(AnnotationParser.java:185)
                at java.base/sun.reflect.annotation.AnnotationParser.parseParameterAnnotations(AnnotationParser.java:162)
                at java.base/java.lang.reflect.Executable.parseParameterAnnotations(Executable.java:83)
                at java.base/java.lang.reflect.Executable.sharedGetParameterAnnotations(Executable.java:567)
                at java.base/java.lang.reflect.Method.getParameterAnnotations(Method.java:756)
                at java.base/java.lang.reflect.Parameter.getDeclaredAnnotations(Parameter.java:318)
                at java.base/java.lang.reflect.Parameter.getAnnotations(Parameter.java:358)
                at org.jboss.weld.resources.HotspotReflectionCache.internalGetAnnotations(HotspotReflectionCache.java:58)
                at org.jboss.weld.resources.DefaultReflectionCache.lambda$new$0(DefaultReflectionCache.java:40)
                at org.jboss.weld.util.cache.ReentrantMapBackedComputingCache.lambda$null$0(ReentrantMapBackedComputingCache.java:55)
                at org.jboss.weld.util.LazyValueHolder$1.computeValue(LazyValueHolder.java:32)
                at org.jboss.weld.util.LazyValueHolder.get(LazyValueHolder.java:46)
                at org.jboss.weld.util.cache.ReentrantMapBackedComputingCache.getValue(ReentrantMapBackedComputingCache.java:72)
                at org.jboss.weld.resources.DefaultReflectionCache.getAnnotations(DefaultReflectionCache.java:75)
                at org.jboss.weld.annotated.slim.backed.BackedAnnotatedParameter.getAnnotations(BackedAnnotatedParameter.java:85)
                at org.jboss.weld.annotated.enhanced.jlr.EnhancedAnnotatedParameterImpl.of(EnhancedAnnotatedParameterImpl.java:44)
                at org.jboss.weld.annotated.enhanced.jlr.EnhancedAnnotatedMethodImpl.<init>(EnhancedAnnotatedMethodImpl.java:80)
                at org.jboss.weld.annotated.enhanced.jlr.EnhancedAnnotatedMethodImpl.of(EnhancedAnnotatedMethodImpl.java:61)
                at org.jboss.weld.annotated.enhanced.jlr.EnhancedAnnotatedTypeImpl.<init>(EnhancedAnnotatedTypeImpl.java:224)
                at org.jboss.weld.annotated.enhanced.jlr.EnhancedAnnotatedTypeImpl.of(EnhancedAnnotatedTypeImpl.java:134)
                at org.jboss.weld.resources.ClassTransformer$TransformSlimAnnotatedTypeToEnhancedAnnotatedType.apply(ClassTransformer.java:93)
                at org.jboss.weld.resources.ClassTransformer$TransformSlimAnnotatedTypeToEnhancedAnnotatedType.apply(ClassTransformer.java:90)
                at org.jboss.weld.util.cache.ReentrantMapBackedComputingCache.lambda$null$0(ReentrantMapBackedComputingCache.java:55)
                at org.jboss.weld.util.LazyValueHolder$1.computeValue(LazyValueHolder.java:32)
                at org.jboss.weld.util.LazyValueHolder.get(LazyValueHolder.java:46)
                at org.jboss.weld.util.cache.ReentrantMapBackedComputingCache.getValue(ReentrantMapBackedComputingCache.java:72)
                at org.jboss.weld.resources.ClassTransformer.getEnhancedAnnotatedType(ClassTransformer.java:251)
                at org.jboss.weld.resources.ClassTransformer.getEnhancedAnnotatedType(ClassTransformer.java:232)
                at org.jboss.weld.injection.producer.SubclassedComponentInstantiator.initEnhancedSubclass(SubclassedComponentInstantiator.java:86)
                at org.jboss.weld.injection.producer.SubclassedComponentInstantiator.<init>(SubclassedComponentInstantiator.java:79)
                at org.jboss.weld.injection.producer.SubclassedComponentInstantiator.forInterceptedDecoratedBean(SubclassedComponentInstantiator.java:63)
                at org.jboss.weld.injection.producer.BeanInjectionTarget.initializeAfterBeanDiscovery(BeanInjectionTarget.java:121)
                at org.jboss.weld.injection.producer.InjectionTargetInitializationContext.initialize(InjectionTargetInitializationContext.java:42)
                at org.jboss.weld.injection.producer.InjectionTargetService.initialize(InjectionTargetService.java:63)
                at org.jboss.weld.bootstrap.WeldStartup.deployBeans(WeldStartup.java:481)
                at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:86)
                at org.jboss.weld.environment.servlet.WeldServletLifecycle.initialize(WeldServletLifecycle.java:237)
                at org.jboss.weld.environment.servlet.EnhancedListener.onStartup(EnhancedListener.java:62)
                at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5166)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                ... 25 more

The error occurs while Weld is processing annotations on parameters, particularly related to javax.enterprise.event.TransactionPhase.

Steps to Reproduce

  1. Create a Maven project with the following dependencies:
    • org.jsr107.ri:cache-annotations-ri-cdi:1.1.1
    • org.jboss.weld.servlet:weld-servlet-core:3.1.2.Final
    • com.github.ben-manes.caffeine:jcache:3.1.6
  2. Add a CDI bean using any JCache annotation (e.g. @OrderCacheHolder ).
package com.russiavk;

import javax.cache.annotation.CacheDefaults;
import javax.cache.annotation.CacheResult;
import javax.cache.annotation.CachePut;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.Initialized; 
import javax.enterprise.event.Observes;
import javax.servlet.ServletContext;

@ApplicationScoped
@CacheDefaults(cacheName = "orderCache")
public class OrderCacheHolder  implements IOrderCacheHolder{

	private static ServletContext servletContext;

	@SuppressWarnings("unused")
	private void init(@Observes @Initialized(ApplicationScoped.class) Object pointless) {
		servletContext = (ServletContext) pointless;
		System.out.println("ServletContext initialized: " + servletContext.getContextPath());

	}
      @Override
       @CacheResult
       public Object get(String key) {
        // ...
       }
   @Override
      @CachePut
      public void put(String key, Object value) {
        // ...
      }
      @Override
      	@CacheRemove
      	public void remove(String key) throws NullPointerException {
          // ...
      }

public interface IOrderCacheHolder {
	<T extends ISubmitDateOrderDTO> T get(String key) throws NullPointerException;

	<T extends ISubmitDateOrderDTO> void put(String key, T value) throws NullPointerException;

	void remove(String key) throws NullPointerException;
}

public interface ISubmitDateOrderDTO {

}

  1. Configure beans.xml to enable the JCache interceptors:
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       bean-discovery-mode="annotated">

    <interceptors>
        <class>org.jsr107.ri.annotations.cdi.CacheResultInterceptor</class>
        <class>org.jsr107.ri.annotations.cdi.CachePutInterceptor</class>
        <class>org.jsr107.ri.annotations.cdi.CacheRemoveEntryInterceptor</class>
        <class>org.jsr107.ri.annotations.cdi.CacheRemoveAllInterceptor</class>
    </interceptors>
</beans>
  1. Deploy on Tomcat / WildFly / or any container using JDK 17 or higher.
  2. Start the application.

Environment

  • JCache RI Version: 1.1.1 (cache-annotations-ri-cdi)
  • CDI Implementation: Weld 3.1.2.Final
  • JDK Version: JDK 17.0.XX / JDK 21 (tested)
  • Servlet Container: Apache Tomcat 9
  • OS: Windows

Additional Information

This appears to be a compatibility issue between older JCache CDI annotation RI and newer JDK's stricter generic signature parsing in reflection.

The problem is triggered when Weld scans methods containing certain javax.enterprise.event.* related annotations.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions