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

时间:2016-10-21 11:12:30

标签: java design-patterns java-ee-6 interceptor

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

MyFacade类

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

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

变量somethingForTheInterceptor未在这些方法中使用,它仅用于拦截器:

SomeInterceptor类

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

不知何故,拥有一个未在方法中使用的参数感觉不太好。还有另一种方式来发送" somethingForTheInterceptor到拦截器?

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

这些是来电者:

MyResource类

@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));
}

我在想 - 资源中的方法是否有可能在某种Context中设置标志,以后可以在Interceptor中注入?

1 个答案:

答案 0 :(得分:1)

在Java EE中,拦截器允许向方法添加前处理和后处理。 因此,Interceptor执行的上下文是方法的上下文。

  

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

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

  

计算它所需的信息是   在REST调用中。

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

要解决您的问题,您确定无法在拦截器中移动标记计算吗? 通过增强拦截器的责任,你不需要花费更长的时间来传递旗帜:

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