Skip to main content

[jsr345-experts] Meta-Annotations

  • From: David Blevins <david.blevins@...>
  • To: jsr345-experts@...
  • Subject: [jsr345-experts] Meta-Annotations
  • Date: Fri, 9 Dec 2011 10:06:20 -0800

I think this is too big for this spec round, but here is the idea in more 
clear terms.

Yes, it is very much like CDI stereotypes.  It's also very much like Bean 
Validation's ability to reuse annotations.  It's also like CDI 
@InterceptorBinding and @Qualifier which also have "meta" effects associated 
with them -- i.e. annotations that use them effectively become 
@InterceptorBindings and @Qualifiers.

We're doing this all over the place really.  It's not entirely CDI or Bean 
Validation specific. It's not EJB specific either, so let's try not to look 
at it and get distracted with the whole align EJB and CDI initiative.

The twist here is that you can "reuse" annotations which aren't designed to 
be applicable to @Target(ANNOTATION_TYPE).  The syntax for it is IMO ugly but 
effective.  If we don't want that twist, we can easily go simpler.

This is really a design pattern and not specification specific.  If there is 
an idea of specification, it would be a Java SE -- it would be quite handy to 
be able inherit annotations in this fashion at a language level and not need 
the cooperation of specific apis.

For our purposes, we could just as easily decide to add ANNOTATION_TYPE to 
all our current annotations and make a simple rule that "annotations with the 
ANNOTATION_TYPE can be used as meta-annotations" and just leave it at that.

Without something like "@Metatype" that model doesn't become recursive, but 
maybe that's good enough.  The "@Metatype" concept is a simple statement of 
"carry these annotations forward".  A simple and explicit statement of how 
far you want the recursion to go.

So here is an exploration of how meta-annotations (annotation reuse) could be 
applied to EJB:

https://github.com/dblevins/metatypes/tree/master/metatype-ejb/src/main/java/javax/ejb/meta

The above is a list of "built-in" meta-annotations we might consider 
delivering out of the box. I've put them in a theoretical "javax.ejb.meta" 
package to make it clear that all the annotations there are simply repackaged 
versions of the actual annotations.

Plummed this into a patched version of CXF's JAX-RS support and it's proving 
to be quite fun there as well:

    @GET
    @Path("/customers/{id}/")
    public Customer getCustomer(@Id String id) {
    }

The applicability to other specs is that part that gives me most pause.  It 
certainly belies the need for a more generic form of annotation reuse that 
isn't specific to a domain like EJB, CDI, Bean Validation, etc.  We keep 
creating domain-specific annotations to drive this form of recursion or reuse 
and really we just need one for the whole language.

It's interesting and fun, but perhaps too young for inclusion.  Or not.


-David



[jsr345-experts] Meta-Annotations

David Blevins 12/09/2011

[jsr345-experts] Re: Meta-Annotations

Marina Vatkina 12/14/2011

[jsr345-experts] Re: Meta-Annotations

Pete Muir 12/14/2011

[jsr345-experts] Re: Meta-Annotations

Marina Vatkina 12/15/2011

[jsr345-experts] Re: Meta-Annotations

Pete Muir 12/15/2011

[jsr345-experts] Re: Meta-Annotations

Marina Vatkina 12/16/2011

[jsr345-experts] Re: Meta-Annotations

Pete Muir 12/19/2011

[jsr345-experts] Re: Meta-Annotations

Reza Rahman 12/19/2011

[jsr345-experts] Re: Meta-Annotations

Carlo de Wolf 12/15/2011
 
 
Close
loading
Please Confirm
Close