On Mon, Apr 15, 2019 at 8:04 PM Christopher Dodunski <
chrisfromtapes...@christopher.net.nz> wrote:

> By creating a ServletContextListener that sets a static ServletContext
> variable in a RegistryProxy class I created, I now have access to the
> Tapestry-IoC registry from anywhere in the application.


Nice!


> However, when I use my custom endpoint Configurator to get an instance of
> ServerEndpoint (implementation) from the registry, it seems that what I
> get back is not castable:
>  java.lang.ClassCastException: Cannot cast
> $HarbourServerEndpoint_39c9cc24eb8b2a to
> com.optomus.harbour.services.HarbourServerEndpointImpl
>

It's not castable nor it should. You shouldn't cast to the service
implementation class. Just use the service interface instead. I'd try this:

    @Override
    public <T> T getEndpointInstance(Class<T> endpointClass) throws
InstantiationException {
        return RegistryProxy.getService(endpointClass.class);
    }

Why is it even referencing HarbourServerEndpointImpl? This, the service
implementation class, should only be referenced in AppModule (or other
Tapestry-IoC module) when declaring the service and maybe also when making
unit tests. Everything else should use HarbourServerEndpoint instead.


My Configurator method:
>
>     @Override
>     public <T> T getEndpointInstance(Class<T> endpointClass) throws
> InstantiationException {
>         return
> endpointClass.cast(RegistryProxy.getService(HarbourServerEndpoint.class));
>     }
>
> My RegistryProxy method:
>
>     public static <T> T getService(Class<T> serviceInterface){
>         Registry registry =
> (Registry)context.getAttribute(TapestryFilter.REGISTRY_CONTEXT_NAME);
>         return registry.getService(serviceInterface);
>     }
>
> Incidentally, altering my Configurator method to use old style casting (as
> per below) didn't solve the problem.
>
>     @Override
>     public <T> T getEndpointInstance(Class<T> endpointClass) throws
> InstantiationException {
>         return (T)RegistryProxy.getService(HarbourServerEndpoint.class);
>     }
>
> Finally, with no casting at all, the compiler gives the error:
>
>     Error:(17, 40) java: incompatible types: inference variable T has
> incompatible bounds
>         equality constraints:
> com.optomus.harbour.services.HarbourServerEndpoint
>         upper bounds: T,java.lang.Object
>
> Regards,
>
> Chris.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
> For additional commands, e-mail: users-h...@tapestry.apache.org
>
>

-- 
Thiago

Reply via email to