To reply, what we already discussed on irc.

This will do it:

         Class<RequestHandler> clazz = (Class<RequestHandler>) tmp;

         InjectionTarget<RequestHandler> it = manager.createInjectionTarget(manager.createAnnotatedType(clazz));
         CreationalContext<RequestHandler> cc = manager.createCreationalContext(null);
         // handler = it.produce(cc); // no need for this, if you already have an instance
         it.inject(handler, cc);


https://github.com/capedwarf/capedwarf-green/blob/master/server-api/src/main/java/org/jboss/capedwarf/server/api/servlet/WeldServlet.java

On Dec 7, 2011, at 1:21 PM, José Rodolfo Freitas wrote:

Ales and All,

when

 @Inject
 GenericQuery<String> gqs;

my producer do:

 new GenericQuery(clazz)

And then @Inject inside GenericQuery does not work (since I'm using new).

What's the best approach in this situation?

Using BeanManagerProvider.getInstance() inside GenericQuery constructor to provide instances for the objects I want to inject?


On Tue, Dec 6, 2011 at 9:29 PM, José Rodolfo Freitas <joserodolfo.freitas@gmail.com> wrote:
that´s an awesome solution Ales!
I didn´t thought that I could obtain the parametizedType that way!
Testing this will be my first task tomorrow morning.

thank you all for your ideas.


On Tue, Dec 6, 2011 at 8:55 PM, Jason Porter <lightguard.jp@gmail.com> wrote:
Nice solution Ales, wish I'd thought of it :)


On Tue, Dec 6, 2011 at 15:45, Ales Justin <ales.justin@gmail.com> wrote:
You could do something like this:

    @SuppressWarnings({"unchecked"})
    @Produces
    public GenericQuery injectClass(InjectionPoint ip) {
        Annotated annotated = ip.getAnnotated();
        Class clazz = Object.class;
        Type type = annotated.getBaseType();
        if (type instanceof ParameterizedType) {
            ParameterizedType pt = (ParameterizedType) type;
            clazz = (Class) pt.getActualTypeArguments()[0];
        }
        return new GenericQuery(clazz);
    }

--

    @Inject
    GenericQuery<String> gqs;
    @Inject
    GenericQuery<Number> gqn;

--

        System.out.println("GQS: " + gqs.getClazz());
        System.out.println("GQN: " + gqn.getClazz());

--

GQS: class java.lang.String
GQN: class java.lang.Number

--


HTH

-Ales

Hey guys, how you doing?

I'm trying to achieve something that might be impossible, but before concluding that, I'd like to ask you, CDI gurus!

I have the following class:

public class Foo<T> {

    public TypedQuery<T> getQuery(){

    }

}

As you can Imagine, inside my getQuery method, I'd have to use "T.class" to make it TypedQuery. which is impossible due java generics type erasure.

so I'd have to build a private field to hold the t.class for me.

public class Foo<T> {

    private Class<T> klass;

    public TypedQuery<T> getQuery(){

    }
    
    public void setKlass(Class<T> klass){
        this.klass = klass;
    }
}

The problem is that forcing this 'setKlass' feels very ugly to the api, and it's not very error prone, since one could easily forget to set this configuration.

So I had an Idea: force the setKlass inside the constructor:

public class Foo<T> {

    private Class<T> klass;
    
    public Foo(Class<T> klass){
        this.klass = klass;
    }

    public TypedQuery<T> getQuery(){

    }

}

Unfortunatelly, this breaks cdi, since it cannot inject it anymore. At least AFAIK.

So, is there a way out of this? maybe using a secret solder feature?
_______________________________________________
seam-dev mailing list
seam-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/seam-dev


_______________________________________________
seam-dev mailing list
seam-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/seam-dev




--
Jason Porter
http://lightguard-jp.blogspot.com
http://twitter.com/lightguardjp

Software Engineer
Open Source Advocate
Author of Seam Catch - Next Generation Java Exception Handling

PGP key id: 926CCFF5
PGP key available at: keyserver.net, pgp.mit.edu