2016-10-21 17 views
0

在我的JEE应用,在GlassFish 3运行,我有以下情况:JEE:如何参数传递给拦截

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”发送给拦截器?

UPDATE:的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)); 
} 

我在想 - 这可能在资源的方法设置在某种语境下的标志,可以被后来注入拦截器?

+0

这个标志值可能是什么?它可能是注释中的一个常量吗?你能解释这个标志的需要吗? – AxelH

回答

1

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

我在想 - 这可能在资源的方法来设置 标志在某种语境的,可以在以后的 拦截注入?

Staless服务应该有特权时,您可以。所以,你应该避免在服务器上存储数据(ThreadLocal,Session等)。

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

为什么? 休息控制器没有职业去做计算和逻辑。

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

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

谢谢,我接受了这个答案,因为它指出替代解决方案可能会带来一些弊端。最好的解决方案是在拦截器中实现'calculateFlag()'方法,这不是不可能的。 – user1414745

+0

不客气。在这种情况下,拦截器可能不是最适合您需求的模式。 – davidxxx