[jbossseam-issues] [JBoss JIRA] Commented: (JBSEAM-1892) org.jboss.seam.Entity constructor gets methods and fields from wrong instance.

Chris Rudd (JIRA) jira-events at lists.jboss.org
Sat Sep 1 00:55:18 EDT 2007


    [ http://jira.jboss.com/jira/browse/JBSEAM-1892?page=comments#action_12374914 ] 
            
Chris Rudd commented on JBSEAM-1892:
------------------------------------

I discovered this using a @MappedSuperclass that defines the @Id


@MappedSuperclass
public class AbstractEntity {

	@SuppressWarnings("unused")
	@Id @GeneratedValue
	private Long id;	

       /**
	 * @return the id
	 */
	public Long getId() {
		return id;
	}

        public void setId(Long id )
        {
             this.id = id;
        }
}

@Entity
public class ConcreteEntity extends AbstractEntity {
}

public void testGetIdentifier()
{
      ConcreteEntity ce = new ConcreteEntity();
      ce.setId( 1000 );
      
      Assert.assertEqual( Entity.forClass( ConcreteEntity.class ) .getIdentifier( ce ), 1000 );
}

> org.jboss.seam.Entity constructor gets methods and fields from wrong instance.
> ------------------------------------------------------------------------------
>
>                 Key: JBSEAM-1892
>                 URL: http://jira.jboss.com/jira/browse/JBSEAM-1892
>             Project: JBoss Seam
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.0.0.BETA1
>            Reporter: Chris Rudd
>
> The constructor for org.jboss.seam.Entity searches the fields and methods of an Entity class. The control loop uses "clazz" for the current class to be scanned, but the code in the for loops access getBeanClass(), so even thogh it checks each super class of the entity, each iteration gets the declared methods/fields from the beanClass.
> Entity.java line 38
>  public Entity(Class<?> beanClass)
>    {
>       super(beanClass);
>       
>       for ( Class<?> clazz=beanClass; clazz!=Object.class; clazz = clazz.getSuperclass() )
>       {
> -         for ( Method method: getBeanClass().getDeclaredMethods() )
> +        for( Method method:clazz.getDeclaredMethods() )
>          {
>             //TODO: does the spec allow multiple lifecycle method
>             //      in the entity class heirarchy?
>             if ( method.isAnnotationPresent(PreRemove.class) )
>             {
>                preRemoveMethod = method;
>             }
>             if ( method.isAnnotationPresent(PrePersist.class) )
>             {
>                prePersistMethod = method;
>             }
>             if ( method.isAnnotationPresent(PreUpdate.class) )
>             {
>                preUpdateMethod = method;
>             }
>             if ( method.isAnnotationPresent(PostLoad.class) )
>             {
>                postLoadMethod = method;
>             }
>             if ( method.isAnnotationPresent(Id.class) || method.isAnnotationPresent(EmbeddedId.class))
>             {
>                identifierGetter = method;
>             }
>             if ( method.isAnnotationPresent(Version.class) )
>             {
>                versionGetter = method;
>             }
>             
>             if ( !method.isAccessible() )
>             {
>                method.setAccessible(true);
>             }
>          }
>          
>          if (identifierGetter==null)
>          {
> -            for ( Field field: getBeanClass().getDeclaredFields() )
> +           for ( Field field: clazz.getDeclaredFields() )
>             {
>                if ( field.isAnnotationPresent(Id.class) || field.isAnnotationPresent(EmbeddedId.class))
>                {
>                   identifierField = field;
>                   if ( !field.isAccessible() )
>                   {
>                      field.setAccessible(true);
>                   }
>                }
>                if ( field.isAnnotationPresent(Version.class) )
>                {
>                   versionField = field;
>                   if ( !field.isAccessible() )
>                   {
>                      field.setAccessible(true);
>                   }
>                }
>             }
>          }
>          
>       }
>       
>    }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the seam-issues mailing list