JEE:如何将参数传递给拦截器

JEE: how to pass parameter to an interceptor

在我的 JEE 应用程序中,运行 在 glassfish 3 上,我遇到以下情况:

MyFacade class

@Interceptors(SomeInterceptor.class)
public void delete(Flag somethingForTheInterceptor, String idToDelete) {
    .......
}

@Interceptors(SomeInterceptor.class)
public void update(Flag somethingForTheInterceptor, MyStuff newStuff) {
    .......
}

这些方法中没有使用变量somethingForTheInterceptor,它只在拦截器中使用:

一些拦截器class

@AroundInvoke
public Object userMayAccessOutlet(InvocationContext ctx) throws Exception {
   Flag flag = extractParameterOfType(Arrays.asList(ctx.getParameters()), Flag.class);
   // some checks on the flag
}

方法中没有使用的参数感觉不太好。有没有其他方法"send" somethingForTheInterceptor 到拦截器?

更新delete()update()的调用者计算somethingForTheInterceptor变量的方法不同。这不是一个常数。计算它所需的信息在 REST 调用中。但是 2 个 REST 方法有不同的输入对象,所以注入 http 请求是不够的。

来电者如下:

我的资源class

@DELETE
@Path("/delete/{" + ID + "}")
public Response delete(@PathParam(ID) final String id) {
   Flag flag = calculateFlagForInterceptor(id);
   facade.delete(flag, id);
}

@POST
@Path("/update")
@Consumes(MediaType.APPLICATION_JSON + RestResourceConstants.CHARSET_UTF_8)
public Response update(final WebInputDTO updateDetails) throws ILeanException {
   Flag flag = calculateFlagForInterceptor(updateDetails);
   facade.update(flag, convertToMyStuff(updateDetails));
}

我在想 - 资源中的方法是否可以在某种上下文中设置标志,稍后可以将其注入拦截器?

在 Java EE 中,拦截器允许向方法添加预处理和 post 处理。 所以,拦截器执行的上下文就是方法的上下文。

I was thinking - is it possible for the methods in the Resource to set the flag in some kind of Context, that can be later injected in the Interceptor?

Staless 服务应尽可能享有特权。因此,您应该避免在服务器上存储数据(ThreadLocal、Session 等)。

The information needed to calculate it is in the REST call.

为什么? Rest 控制器没有计算和逻辑的职责。

为了解决你的问题,你确定你不能在你的拦截器中移动标志计算吗? 通过增强拦截器的职责,您将不再需要更长的时间来传递标志:

@AroundInvoke
public Object userMayAccessOutlet(InvocationContext ctx) throws Exception {
   Flag flag = calculFlag(Arrays.asList(ctx.getParameters()));
   // some checks on the flag
}