@AroundInvoke拦截器在哪里被调用?

时间:2015-09-04 16:15:08

标签: java-ee interceptor

我正在使用java做一些测试示例,我想出了一个使用@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());
    }
}

1 个答案:

答案 0 :(得分:6)

通过做其他拦截器示例我想通了。

@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注释用于为托管对象方法指定拦截器方法。

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