下面是一个简单的web应用程序,它被配置为运行在glassfish4上的Rest服务。该应用程序本身工作,可以访问单一的资源。
拦截器不适用于pong(),但神奇地适用于helloW()。当我为helloW()激活时,我可以修改和改写参数,抛出异常等等.但所有这些都不适用于pong()。在其他地方,我尝试使用无状态ejb --结果是相同的--而不是工作--甚至使用ejb程序集绑定部署描述符。为什么?
Rest:
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>不是joy。
发布于 2015-08-27 21:22:59
免责声明:这只是猜测,因为我没有找到任何相关的支持文档,而且它还可能依赖于服务器的/JRE实现。
它无法工作,因为@GET注释方法是通过使用java反射/内省技术调用的。这避免了框架拦截该调用,因为它是直接在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那样被拦截。
我能想到的唯一解决办法是您已经做了什么:在另一个没有注释的方法中提取逻辑。
https://stackoverflow.com/questions/32259065
复制相似问题