[jbossseam-issues] [JBoss JIRA] Commented: (JBSEAM-3965) @Providers not working - ResteasyDispatcher registers components and providers in wrong order

Balazs Pataki (JIRA) jira-events at lists.jboss.org
Mon Feb 23 04:40:46 EST 2009


    [ https://jira.jboss.org/jira/browse/JBSEAM-3965?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12453723#action_12453723 ] 

Balazs Pataki commented on JBSEAM-3965:
---------------------------------------

You're maybe right that it only effects StringConverters. I now tried with an EAR project instead of WAR project, so that my TaskConverter is an EJB and looks like this:

@Name("TaskConverter")
@Provider
@Scope(ScopeType.APPLICATION)
@Stateful
public class TaskConverter<T> implements StringConverter<Task>{
...
}

So, it is Stateful and APPLICATION scoped. Now in ResteasyProviderFactory#addStringConverter() the "intfs" contains this for teh TaskConverter's javassist proxy object:

[interface org.jboss.seam.Instance, interface org.jboss.seam.intercept.Proxy, interface org.jboss.resteasy.spi.StringConverter, interface javassist.util.proxy.ProxyObject]

The org.jboss.resteasy.spi.StringConverter interface is now there, however it is not what actually is expected by this method: it needs a ParameterizedType where the raw type is the StringConverter.class. So, it really seems to me that when the javassist proxy is created it gets wrong types, namely, a StringConverter instead of a ParameterizedType with a StringConverter as its raw type.

Could you Jozef maybe take a look at this issue and try to create a StringConverter which also acts a Seam component? It would be good to know whether the problem is with me or with Seam (or javassist or RESTEasy. ;-) )

Thanks,
---
balazs

> @Providers not working - ResteasyDispatcher registers components and providers in wrong order
> ---------------------------------------------------------------------------------------------
>
>                 Key: JBSEAM-3965
>                 URL: https://jira.jboss.org/jira/browse/JBSEAM-3965
>             Project: Seam
>          Issue Type: Bug
>          Components: WS
>    Affects Versions: 2.1.1.CR1
>            Reporter: Balazs Pataki
>            Assignee: Jozef Hartinger
>
> While using the latest nightly build (from 2009.02.19) I found that my @Provider annotated class is not used by Seam+RESTEasy. It seemed to be loaded but not used by injection mechanism. By debugging the code I found out that it is not used because org.jboss.seam.resteasy.ResteasyDispatcher#onStartup()  first registers the resources and after that the providers. However, as part of the resource registration the injection mechanism including the converters are set up, however at this point the converters (providers) have not been loaded.
> It seems to first load the providers and then the resources.
> This is my patch that worked in my setup:
> > diff -c ResteasyDispatcher.java ResteasyDispatcher_orig.java                                                     
> *** ResteasyDispatcher.java     2009-02-20 11:10:35.000000000 +0100                                                
> --- ResteasyDispatcher_orig.java        2009-02-19 00:18:26.000000000 +0100                                        
> ***************                                                                                                    
> *** 56,91 ****                                                                                                     
>           getDispatcher().setLanguageMappings(application.getLanguageMappings());                                  
>           getDispatcher().setMediaTypeMappings(application.getMediaTypeMappings());                                
>                                                                                                                    
> -         // Provider registration                                                                                 
> -         if (application.isUseBuiltinProviders())                                                                 
> -         {                                                                                                        
> -             log.info("registering built-in RESTEasy providers");                                                 
> -             RegisterBuiltin.register(providerFactory);                                                           
> -         }                                                                                                        
> -         for (Class providerClass : application.getProviderClasses())                                             
> -         {                                                                                                        
> -             Component seamComponent = application.getProviderClassComponent(providerClass);                      
> -             if (seamComponent != null)                                                                           
> -             {                                                                                                    
> -                 if (ScopeType.STATELESS.equals(seamComponent.getScope()))                                        
> -                 {                                                                                                
> -                     throw new RuntimeException(                                                                  
> -                             "Registration of STATELESS Seam components as RESTEasy providers not implemented!"   
> -                     );                                                                                           
> -                 }                                                                                                
> -                 else if (ScopeType.APPLICATION.equals(seamComponent.getScope()))                                 
> -                 {                                                                                                
> -                     Object providerInstance = Component.getInstance(seamComponent.getName());                    
> -                     providerFactory.registerProviderInstance(providerInstance);                                  
> -                 }                                                                                                
> -             }                                                                                                    
> -             else                                                                                                 
> -             {                                                                                                    
> -                 // Just plain RESTEasy, no Seam component lookup or lifecycle                                    
> -                 providerFactory.registerProvider(providerClass);                                                 
> -             }                                                                                                    
> -         }                                                                                                        
> -                                                                                                                  
>           // Resource registration                                                                                 
>           Registry registry = getDispatcher().getRegistry();                                                       
>           for (final Class resourceClass : application.getClasses())                                               
> --- 56,61 ----                                                                                                     
> ***************                                                                                                    
> *** 133,137 ****                                                                                                   
> --- 103,138 ----                                                                                                   
>                   registry.addResourceFactory(new POJOResourceFactory(resourceClass));                             
>               }                                                                                                    
>           }                                                                                                        
> +                                                                                                                  
> +         // Provider registration                                                                                 
> +         if (application.isUseBuiltinProviders())                                                                 
> +         {                                                                                                        
> +             log.info("registering built-in RESTEasy providers");                                                 
> +             RegisterBuiltin.register(providerFactory);
> +         }
> +         for (Class providerClass : application.getProviderClasses())
> +         {
> +             Component seamComponent = application.getProviderClassComponent(providerClass);
> +             if (seamComponent != null)
> +             {
> +                 if (ScopeType.STATELESS.equals(seamComponent.getScope()))
> +                 {
> +                     throw new RuntimeException(
> +                             "Registration of STATELESS Seam components as RESTEasy providers not implemented!"
> +                     );
> +                 }
> +                 else if (ScopeType.APPLICATION.equals(seamComponent.getScope()))
> +                 {
> +                     Object providerInstance = Component.getInstance(seamComponent.getName());
> +                     providerFactory.registerProviderInstance(providerInstance);
> +                 }
> +             }
> +             else
> +             {
> +                 // Just plain RESTEasy, no Seam component lookup or lifecycle
> +                 providerFactory.registerProvider(providerClass);
> +             }
> +         }
> +
>       }
>   }

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

        



More information about the seam-issues mailing list