gpt4 book ai didi

jakarta-ee - @AroundInvoke 拦截器在哪里调用?

转载 作者:行者123 更新时间:2023-12-04 14:57:11 27 4
gpt4 key购买 nike

我正在用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());
}
}

最佳答案

我想通了,通过做另一个拦截器的例子。

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

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

关于jakarta-ee - @AroundInvoke 拦截器在哪里调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32402444/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com