You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by Apache Wiki <wi...@apache.org> on 2011/09/01 20:24:51 UTC
[Tapestry Wiki] Update of "JEE-Annotation" by LennyPrimak
Dear Wiki user,
You have subscribed to a wiki page or wiki category on "Tapestry Wiki" for change notification.
The "JEE-Annotation" page has been changed by LennyPrimak:
http://wiki.apache.org/tapestry/JEE-Annotation
New page:
= How to make @EJB Annotation work in Tapestry pages and components =
This works on Tapestry 5.3 or higher.
== In your AppModule.java file, add the following method ==
{{{
@Contribute(ComponentClassTransformWorker2.class)
@Primary
public static void provideClassTransformWorkers(OrderedConfiguration<ComponentClassTransformWorker2> configuration)
{
configuration.addInstance("EJB", EJBAnnotationWorker.class, "before:Property");
}
}}}
== EJBAnnotationWorker.java ==
(add this to one of your non-tapestry packages)
{{{
/**
* Inject an EJB into tapestry sources
*
* @author Magnus
* Enhancements by Lenny Primak
*/
public class EJBAnnotationWorker implements ComponentClassTransformWorker2
{
@Override
@SneakyThrows(NamingException.class)
public void transform(PlasticClass plasticClass,
TransformationSupport support, MutableComponentModel model)
{
for (PlasticField field : plasticClass.getFieldsWithAnnotation(EJB.class))
{
final EJB annotation = field.getAnnotation(EJB.class);
String fieldType = field.getTypeName();
String lookupname = null;
//try lookup
if (!isBlankOrNull(annotation.lookup()))
{
lookupname = annotation.lookup();
} //try name
else if(!isBlankOrNull(annotation.name()))
{
lookupname = annotation.name();
}
else if(!isBlankOrNull(annotation.beanName()))
{
lookupname = annotation.beanName();
}
//use type
if (lookupname == null)
{
lookupname = guessByType(fieldType);
}
lookupname = prependPortableName(lookupname);
Object injectionValue = locator.getJNDIObject(lookupname);
if (injectionValue != null)
{
field.inject(injectionValue);
field.claim(annotation);
}
}
}
public static String guessByType(String type)
{
String lookupname = type.substring(type.lastIndexOf(".") + 1);
// support naming convention that strips Local/Remote from the
// end of an interface class to try to determine the actual bean name,
// to avoid @EJB(beanName="myBeanName"), and just use plain old @EJB
String uc = lookupname.toUpperCase();
if (uc.endsWith(LOCAL) || uc.endsWith(REMOTE)) {
lookupname = StripLocalPattern.matcher(lookupname).replaceFirst("");
}
return lookupname;
}
public static String prependPortableName(String lookupname)
{
//convert to jndi name
if (!lookupname.startsWith("java:"))
{
lookupname = "java:module/" + lookupname;
}
return lookupname;
}
private boolean isBlankOrNull(String s)
{
return s == null || s.trim().equals("");
}
private final JNDIObjectLocator locator = new JNDIObjectLocator();
private static final String REMOTE = "REMOTE";
private static final String LOCAL = "LOCAL";
public static final Pattern StripLocalPattern = Pattern.compile(LOCAL + "|" + REMOTE, Pattern.CASE_INSENSITIVE);
}
}}}
== Using @EJB in your client code ==
{{{
class SomeTapestryPage
{
@EJB private MyStatelessBeanLocal localBean;
}
}}}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
For additional commands, e-mail: dev-help@tapestry.apache.org