Home Objects & EJB3 Interceptors
tarciosaraiva Jun 4, 2009 6:40 AMHi all. I'm starting to use Seam but am a bit lost - or what I'm trying to do is simply not achievable.
Well, the background scenario is: I've just created a new Seam application on Eclipse. Then, created a few entities and Seam Actions.
That all works fine and I believe I got what an EntityHome is: a simple object to easy our life on persistence.
Anyway, as I said, I can insert, update and remove. It works beautifully.
However, I would like to add an interceptor: when I say interceptor is the EJB3-like interceptor, using the @Interceptors(Clazz.class) annotation, etc; so I can register some information before the actual persistence on the database.
Well, I was reading through the documentation and got into the stage my code is at the moment.
Here's my class to be intercepted:
package com.metrofile.metroasset.session;
import javax.interceptor.Interceptors;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.web.RequestParameter;
import org.jboss.seam.ejb.SeamInterceptor;
import org.jboss.seam.framework.EntityHome;
import com.metrofile.metroasset.entity.Location;
import com.metrofile.metroasset.interceptors.LocationChange;
@Name("locationHome")
@LocationChange
@Interceptors(SeamInterceptor.class)
public class LocationHome extends EntityHome<Location> {
private static final long serialVersionUID = 260787915456177497L;
@RequestParameter
Long locationId;
@Override
public Object getId() {
if (locationId == null) {
return super.getId();
} else {
return locationId;
}
}
@Override
@Begin
public void create() {
super.create();
}
}Here's my Interceptor:
package com.metrofile.metroasset.interceptors;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.jboss.seam.annotations.intercept.Interceptor;
import com.metrofile.metroasset.entity.LocationLog;
@Interceptor
public class LocationChangeInterceptor {
@PersistenceContext(unitName = "metroAsset")
private EntityManager em;
@AroundInvoke
public Object addModificationHistory(InvocationContext invocation)
throws Exception {
LocationLog log = new LocationLog();
log.setDescription(invocation.getMethod().toString());
try {
em.persist(log);
em.flush();
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
return invocation.proceed();
}
}And finally the annotation (as explained at the documentation):
package com.metrofile.metroasset.interceptors;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import javax.interceptor.Interceptors;
/**
* @author <a href="mailto:support@metrofile.com.au">Tarcio Saraiva</a>
* @version 04/06/2009
*/
@Target( { ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Interceptors(LocationChangeInterceptor.class)
public @interface LocationChange {
}The main issue is that the EntityManager on the interceptor LocationChangeInterceptor is always null. Doesn't matter what I change - and tags I use - it's always null.
Am I missing something? Is that the right way to use it?
Thank you for your answers in advance - slowly I'm building up my Seam knowledge (great framework!)