Uploaded image for project: 'OpenWebBeans'
  1. OpenWebBeans
  2. OWB-558

PassivationCapable bean id's for Producer Fields do not take into account generics

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 1.0.0
    • 1.1.1
    • Core
    • None

    Description

      If you have two producer fields like:

      @Produces @SessionScoped List<String> produceList1 = new ArrayList<String>();
      @Produces @SessionScoped List<Integer> produceList2 = new ArrayList<Integer>();

      At application startup you will get the following error:
      [4/4/11 17:26:41:656 EDT] 00000028 BeansDeployer E BeansDeployer deploy
      org.apache.webbeans.exception.definition.DuplicateDefinitionException: PassivationCapable bean id is not unique: PRODUCERFIELD#interface java.util.List#@javax.enterprise.inject.Any(),@javax.enterprise.inject.Default(), bean:1472604072,Name:null,WebBeans Type:PRODUCERFIELD,API Types:[java.util.Collection,java.lang.Iterable,java.lang.Object,java.util.List],Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default]
      at org.apache.webbeans.container.BeanManagerImpl.addPassivationInfo(BeanManagerImpl.java:366)
      at org.apache.webbeans.container.BeanManagerImpl.addBean(BeanManagerImpl.java:338)
      at org.apache.webbeans.util.WebBeansUtil.defineManagedBean(WebBeansUtil.java:3149)
      at org.apache.webbeans.config.BeansDeployer.defineManagedBean(BeansDeployer.java:881)
      at org.apache.webbeans.config.BeansDeployer.deploySingleAnnotatedType(BeansDeployer.java:536)
      at org.apache.webbeans.config.BeansDeployer.deployFromClassPath(BeansDeployer.java:482)
      at org.apache.webbeans.config.BeansDeployer.deploy(BeansDeployer.java:171)
      at org.apache.webbeans.lifecycle.AbstractLifeCycle.startApplication(AbstractLifeCycle.java:124)
      at org.apache.webbeans.web.lifecycle.WebContainerLifecycle.startApplication(WebContainerLifecycle.java:78)

      This is because the ID generated:
      RODUCERFIELD#interface java.util.List#@javax.enterprise.inject.Any(),@javax.enterprise.inject.Default()

      Doesn't take into account any generic types.

      It looks like ProducerMethods fix this by adding some additional information:
      passivatingId = id + "#" + creatorMethod.toGenericString();

      We probably need to do something similar with the fields from producer fields.

      Attachments

        Activity

          People

            bergmark Joseph E Bergmark
            bergmark Joseph E Bergmark
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: