Java tutorial
File:Employee.java import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.PostRemove; @Entity public class Employee implements java.io.Serializable { private int id; private String firstName; private String lastName; @Id @GeneratedValue public int getId() { return id; } @PostRemove public void postRemove() { System.out.println("@PostRemove"); } public void setId(int id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String first) { this.firstName = first; } public String getLastName() { return lastName; } public void setLastName(String last) { this.lastName = last; } } File:EmployeeService.java import javax.ejb.Stateless; import javax.transaction.TransactionManager; @Stateless public class EmployeeService implements EmployeeServiceLocal, EmployeeServiceRemote { public EmployeeService() { } @JndiInjected("java:/TransactionManager") TransactionManager tm; public void doAction() throws Exception { System.out.println("Is there a transaction: " + (tm.getTransaction() != null)); } } File:EmployeeServiceLocal.java import java.util.Collection; import javax.ejb.Local; @Local public interface EmployeeServiceLocal { public void doAction() throws Exception; } File:EmployeeServiceRemote.java import java.util.Collection; import javax.ejb.Remote; @Remote public interface EmployeeServiceRemote{ public void doAction() throws Exception; } File:JndiInjected.java import java.lang.annotation.*; @Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface JndiInjected { String value(); } File:JndiInjector.java import java.lang.reflect.*; import javax.ejb.*; import javax.interceptor.*; import javax.naming.*; import javax.annotation.PostConstruct; public class JndiInjector { @PostConstruct public void jndiInject(InvocationContext invocation) { Object target = invocation.getTarget(); Field[] fields = target.getClass().getDeclaredFields(); Method[] methods = target.getClass().getDeclaredMethods(); // find all @JndiInjected fields methods and set them try { InitialContext ctx = new InitialContext(); for (Method method : methods) { JndiInjected inject = method.getAnnotation(JndiInjected.class); if (inject != null) { Object obj = ctx.lookup(inject.value()); method.setAccessible(true); method.invoke(target, obj); } } for (Field field : fields) { JndiInjected inject = field.getAnnotation(JndiInjected.class); if (inject != null) { Object obj = ctx.lookup(inject.value()); field.setAccessible(true); field.set(target, obj); } } invocation.proceed(); } catch (Exception ex) { throw new EJBException("Failed to execute @JndiInjected", ex); } } } File:Main.java import java.util.Date; import javax.naming.InitialContext; public class Main { public static void main(String[] a) throws Exception { EmployeeServiceRemote service = null; // Context compEnv = (Context) new InitialContext().lookup("java:comp/env"); // service = (HelloService)new InitialContext().lookup("java:comp/env/ejb/HelloService"); service = (EmployeeServiceRemote) new InitialContext().lookup("EmployeeService/remote"); service.doAction(); } } File:jndi.properties java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces java.naming.provider.url=localhost:1099