在我的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中注入?
答案 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
}