java拦截器不拦截
java interceptor doesn't intercept
下面是在 glassfish4 上配置为 Rest 服务 运行 的简单 Web 应用程序。应用程序本身可以运行,可以访问单个资源。
拦截器不适用于 pong(),但神奇地适用于 helloW()。当我为 helloW() 激活时,我可以修改和覆盖参数,可以抛出异常,等等......但是 none 这适用于 pong()。在其他地方,我尝试使用无状态 ejb - 结果相同 - 不起作用 - 即使使用 ejb-jar 程序集绑定部署描述符。为什么?
休息:
package main;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("/service")
@javax.ejb.Stateless
public class Service {
@GET
@Produces("text/plain")
// @javax.interceptor.Interceptors({Intercept.class})
public String helloW(String ss){
String msg = pong("QQ");
return msg;
//return ss;
}
@javax.interceptor.Interceptors({Intercept.class})
public String pong(String m){
String temp = m;
return temp;
}
}
拦截器本身:
package main;
@javax.interceptor.Interceptor
public class Intercept {
@javax.interceptor.AroundInvoke
Object qwe(javax.interceptor.InvocationContext ctx) throws Exception{
ctx.setParameters(new Object[]{"intercepted attribute"});
throw new Exception();
// return ctx.proceed();
}
}
是的,我确实尝试过 beans.xml:
<interceptors><class>main.Intercept</class></interceptors>
不开心。
免责声明:这是一个猜测,因为我没有找到任何关于此的支持文档,它也可能取决于服务器's/JRE 实现。
它不起作用,因为 @GET 注释方法是通过使用 java reflection/introspection 技术调用的。这避免了框架拦截该调用,因为它是直接在 JRE 内部完成的。
为了证明这一点,而不是直接调用 "pong",请尝试以下操作:
try {
String msg = (String) this.getClass().getDeclaredMethod("pong", String.class).invoke(this, ss);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
只需替换示例中该代码的 String msg = pong("QQ");
。
您应该看到 pong 方法现在没有像 helloW 那样被拦截。
我能想到的唯一解决方法是您已经做过的:在另一个未注释的方法中提取逻辑。
下面是在 glassfish4 上配置为 Rest 服务 运行 的简单 Web 应用程序。应用程序本身可以运行,可以访问单个资源。
拦截器不适用于 pong(),但神奇地适用于 helloW()。当我为 helloW() 激活时,我可以修改和覆盖参数,可以抛出异常,等等......但是 none 这适用于 pong()。在其他地方,我尝试使用无状态 ejb - 结果相同 - 不起作用 - 即使使用 ejb-jar 程序集绑定部署描述符。为什么?
休息:
package main;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("/service")
@javax.ejb.Stateless
public class Service {
@GET
@Produces("text/plain")
// @javax.interceptor.Interceptors({Intercept.class})
public String helloW(String ss){
String msg = pong("QQ");
return msg;
//return ss;
}
@javax.interceptor.Interceptors({Intercept.class})
public String pong(String m){
String temp = m;
return temp;
}
}
拦截器本身:
package main;
@javax.interceptor.Interceptor
public class Intercept {
@javax.interceptor.AroundInvoke
Object qwe(javax.interceptor.InvocationContext ctx) throws Exception{
ctx.setParameters(new Object[]{"intercepted attribute"});
throw new Exception();
// return ctx.proceed();
}
}
是的,我确实尝试过 beans.xml:
<interceptors><class>main.Intercept</class></interceptors>
不开心。
免责声明:这是一个猜测,因为我没有找到任何关于此的支持文档,它也可能取决于服务器's/JRE 实现。
它不起作用,因为 @GET 注释方法是通过使用 java reflection/introspection 技术调用的。这避免了框架拦截该调用,因为它是直接在 JRE 内部完成的。
为了证明这一点,而不是直接调用 "pong",请尝试以下操作:
try {
String msg = (String) this.getClass().getDeclaredMethod("pong", String.class).invoke(this, ss);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
只需替换示例中该代码的 String msg = pong("QQ");
。
您应该看到 pong 方法现在没有像 helloW 那样被拦截。
我能想到的唯一解决方法是您已经做过的:在另一个未注释的方法中提取逻辑。