2014-09-20 6 views
2

У меня есть приложение Java SE с этими классами:CDI транзакционных Перехватчик не работает

главное:

public static void main(String args[]) 
    { 
     Weld weld = new Weld(); 
     WeldContainer container = weld.initialize(); 

     ShopCar sc = container.instance().select(ShopCar.class).get(); 
     sc.execute(); 
     weld.shutdown(); 
    } 

Мой DAO (не выполнены в полном объеме):

/** 
* 
* @author vFreitas 
* @param <T> The type T 
*/ 
public class JpaDAO<T> implements DAO<T>, Serializable 
{ 
    /* The EntityManager of my connection */ 
    private final EntityManager em; 
    /* The class to be persist */ 
    private final Class<T> classe; 

    private ThreadLocal<EntityManager> threadLocal; 

    /* Builder */ 
    /** 
    * 
    * @author info1 
    * @param classe The class to that will represent T 
    * @param em A new instance of EntityManager 
    */ 
    public JpaDAO(Class<T> classe, EntityManager em) 
    { 
     this.classe = classe; 
     this.em = em; 
     threadLocal = new ThreadLocal<>(); 
     threadLocal.set(em); 
    } 

    @Override 
    @Transacional 
    public void save(T entity) 
    { 
     //em.getTransaction().begin(); 
     em.persist(entity); 
     //em.getTransaction().commit(); 
    } 

... 

Мой DAOFactory:

public class DAOFactory<T> 
{ 
    @Inject @MyDatabase private EntityManager em; 

    @SuppressWarnings({ "rawtypes", "unchecked" })  
    @Produces 
    public JpaDAO<T> createJpaDAO(InjectionPoint injectionPoint) throws 
      ClassNotFoundException 
    {  
     ParameterizedType type = (ParameterizedType) injectionPoint.getType();  
     Class classe = (Class) type.getActualTypeArguments()[0]; 
     return new JpaDAO<>(classe,em);  
    }  
} 

I nterceptor аннотация:

@Target({ ElementType.METHOD, ElementType.TYPE }) 
@Retention(RetentionPolicy.RUNTIME) 
@InterceptorBinding 
public @interface Transacional 
{ 

} 

и мои interceptorImpl:

@Interceptor 
@Transacional 
public class TransacionalInterceptor 
{ 

    @Inject @MyDatabase 
    private EntityManager manager; 

    @Inject private ThreadLocal<EntityManager> threadLocal; 

    Logger logger = LoggerFactory.getLogger(TransacionalInterceptor.class); 

    @AroundInvoke 
    public Object invoke(InvocationContext context) throws Exception 
    { 
     manager = threadLocal.get(); 
     //EntityTransaction trx = manager.getTransaction(); 
     if(!manager.getTransaction().isActive()) 
     { 
      manager.getTransaction().begin(); 
      System.out.println("Starting transaction"); 
      Object result = context.proceed(); 
      manager.getTransaction().commit(); 
      System.out.println("Committing transaction"); 
      return result; 
     } 

beans.xml:

<beans xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd" > 

    <interceptors> 
     <class>shopcar.util.TransacionalInterceptor</class> 
    </interceptors> 
</beans> 

Когда я сохранить объект он говорит, что мне нужно, чтобы открыть свою сделку ... так мой перехватчик не вызывается. Я много искал и не знаю, в чем проблема с моим кодом. Я ценю некоторую помощь. Благодаря!

+0

Пожалуйста, напишите свой 'beans.xml' –

+0

@JohnAment опубликовано –

ответ

3

Хорошо, мне пришлось перечитать ваш вопрос, чтобы увидеть проблему.

Проблема заключается в том, что в вашем методе производителя вы создаете DAO. Поскольку вы создаете экземпляр с помощью new, вы обходите привязки перехватчиков.

+0

Спасибо за азерсера и как я могу создать свой JpaDAO без использования новых? Я сделал поиск и ничего не нашел. –

+0

Просто удалите метод производителя ... используйте конструктор по умолчанию. Используйте конкретную реализацию. –