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-unsubscr...@tapestry.apache.org For additional commands, e-mail: dev-h...@tapestry.apache.org