2015-09-04 66 views
3

我正在用java做一些测试例子,我想出了一个使用@AroundInvoke的例子。问题是我不确切知道调用的方法在哪里。@AroundInvoke拦截器在哪里被调用?

该测试在调用post()方法的地方进行调用,但我真的不知道这是如何工作的(Using Interceptors explanation)。

@Test 
public void crudtest() { 
    JsonObjectBuilder todoBuilder = Json.createObjectBuilder(); 
    JsonObject todoToCreate = todoBuilder. 
      add("caption", "implement"). 
      add("priority", 10). 
      build(); 

    //The next post execute, invoke the method 
    Response postResponse = this.provider.target().request(). 
      post(Entity.json(todoToCreate)); 
} 

调用的顺序是BoundaryLogger然后MonitorSink

BoundaryLogger.java

... 
public class BoundaryLogger { 

    @Inject 
    Event<CallEvent> monitoring; 

    @AroundInvoke 
    public Object logCall(InvocationContext ic) throws Exception { 
     long start = System.currentTimeMillis(); 
     try { 
      return ic.proceed(); 
     } finally { 
      long duration = System.currentTimeMillis() - start; 
      monitoring.fire(new CallEvent(ic.getMethod().getName(), duration)); 
     } 
    } 
} 

MonitorSink

@Singleton 
@ConcurrencyManagement(ConcurrencyManagementType.BEAN) 
public class MonitorSink { 

    @Inject 
    LogSink LOG; 

    public void onCallEvent(@Observes CallEvent event){ 
     LOG.log(event.toString()); 
    } 
} 

回答

3

我想通了,做一个ñ其他拦截器的例子。

@AroundInvoke只是定义一个拦截器,它将由具有@Interceptor(name_class.class)的类调用。

在我的情况下,这是我错过了看它的代码。

ToDoManager.java

@Stateless 
@Interceptors(BoundaryLogger.class) 
public class ToDoManager { 

    @PersistenceContext 
    EntityManager em; 

    public ToDo findById(long id) { 
     return this.em.find(ToDo.class,id); 
    } 

    public void delete(long id) { 
     try { 
      ToDo reference = this.em.getReference(ToDo.class, id); 
      this.em.remove(reference); 
     } catch (EntityNotFoundException e) { 
      //we want to remove it... 
     } 
    } 

    public List<ToDo> all() { 
     return this.em.createNamedQuery(ToDo.findAll, ToDo.class).getResultList(); 
    } 

    public ToDo save(ToDo todo) { 
     return this.em.merge(todo); 
    } 

    public ToDo updateStatus(long id, boolean done) { 
     ToDo todo = this.findById(id); 
     if(todo == null){ 
      return null; 
     } 
     todo.setDone(done); 
     return todo; 
    } 

} 

的@AroundInvoke注释被用于指定为被管理对象的方法的拦截器的方法。

我希望,这可以帮助别人!