For those of you who would like to use final fields, wish to avoid numerous setters, or dislike private field injection and would like nothing more than to just use plan old java constructors, your wish has come true.  This is a feature we intended to add to OpenEJB 3.0 but didn't have time for.  We're happy to bring it to the OpenEJB 3.1 release and with a bit of luck and support from people like yourself, we'll see this as an EJB 3.1 feature as well.

{code}
@Stateless
public class WidgetBean implements Widget {

    @EJB(beanName = "FooBean")
    private final Foo foo;

    @Resource(name = "count")
    private final int count;

    @Resource
    private final DataSource ds;

    public WidgetBean(Integer count, Foo foo, DataSource ds) {
        this.count = count;
        this.foo = foo;
        this.ds = ds;
    }

    public int getCount() {
        return count;
    }

    public Foo getFoo() {
        return foo;
    }
}
{code}

The @EJB, @Resource, @PersistenceUnit, and @PersistenceContext annotations can be placed at the class-level instead such as:

{code}
@Stateless
@EJB(name = "foo", beanInterface = Foo.class, beanName = "FooBean")
@Resource(name = "count", type = int.class)
@Resource(name = "ds", type = DataSource.class)
public class WidgetBean implements Widget {

    public WidgetBean(Integer count, Foo foo, DataSource ds) {
       // do something
    }

    public int getCount() {
        return count;
    }

    public Foo getFoo() {
        return foo;
    }
}
{code}


Currently this functionality relies on classes being compiled with debug symbols (the default compile setting for javac) as we use the debug table in the byte code to discover the constructor arg names.  Additionally, you must not have a no-arg constructor.  If a no-arg constructor is present, that constructor will be used instead.

Ideally, we would like the annotations to be used on the parameters directly as shown below.  Unfortunately, this does not work as the Java EE annotation classes do not permit usage on parameters.  If you'd like to see that change as much as we do, definitely voice your support by sending note to [jsr-316-comments@jcp.org|mailto:jsr-316-comments@jcp.org]


{code:title=Not yet possible}
@Stateless

public class WidgetBean implements Widget {

    public WidgetBean(@Resource(name = "count") Integer count, @EJB Foo foo, @Resource DataSource ds) {
       // do something
    }

    public int getCount() {
        return count;
    }

    public Foo getFoo() {
        return foo;
    }
}
{code}


