最近在写spring+resteasy的项目,要拦截app的所有请求,用的拦截器是resteasy的拦截器,但是resteasy得拦截器必须要在web.xml中声明,然后拦截器里面的里面的service属性一直为空。后来将service这个成员变量去掉,选择在拦截器的方法中通过spring的getBean方法获取,代码如下:
原来的代码如下:
@Provider
@ServerInterceptor
@Precedence("END")
public class AppRequestInterceptor implements PreProcessInterceptor, AcceptedByMethod {
@Autowired
private AddOnArticleService addOnArticleService;
public ServerResponse preProcess(HttpRequest request, ResourceMethod method)
throws Failure, WebApplicationException {
System.out.println(request.getPreprocessedPath());
System.out.println(request.getHttpMethod());
System.out.println(method);
System.out.println("addOnArticleService------"+addOnArticleService">);
return null;
}
public boolean accept(Class declaring, Method method) {
return true;
}
}
其中的 addOnArticleService 一直为空
之后的解决办法如下:
在方法中调用的代码,通过获取getBean获取service实例:
public ServerResponse preProcess(HttpRequest request, ResourceMethod method)
throws Failure, WebApplicationException {
aboutUsService = (AboutUsService)ApplicationContextHandle.getBean("aboutUsService");
System.out.println("ApplicationContextHandle.getBean(aboutUsService)------"+aboutUsService.getAboutUs());
return null;
}
建立一个实现 org.springframework.context.ApplicationContextAware 接口的类:
public class ApplicationContextHandle implements ApplicationContextAware{
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContextHandle.applicationContext = applicationContext;
}
/**
* 获取对象
* 这里重写了bean方法,起主要作用
* @param name
* @return Object 一个以所给名字注册的bean的实例
* @throws BeansException
*/
public static Object getBean(String name) throws BeansException {
return applicationContext.getBean(name);
}
}
注意,需要在spring的配置文件中配置:
<bean class="com.flare.interceptor.ApplicationContextHandle" lazy-init="false"/>