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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions