Java filter调用service的方法

版权声明:本文为博主原创文章,未经博主允许不得转载。
      今天在项目中遇到了一个问题,在 Filter中注入 Serivce失败,注入的service始终为null。经过一番分析后,问题得到了解决。现在给大家分享一下。以下代码展示区域只展示了部分关键代码。
1、报控制针的代码如下所示:

public class SessionFilter implements Filter{
      @Autowired
     private SystemService systemService;
 
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
         HttpServletRequest req = (HttpServletRequest)request;
         HttpServletResponse resp = (HttpServletResponse)response;
       TUser user = this.systemService.findHql("from TUser  where userName='admin' ");//此处的 systemService会报空指针异常。
       chain.doFilter(request, response);
 }

2、解决方案:
2.1、解决方案一如下所示:

public class SessionFilter implements Filter{
      @Autowired
     private SystemService systemService;
 
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
         HttpServletRequest req = (HttpServletRequest)request;
         HttpServletResponse resp = (HttpServletResponse)response;
         //以下为比较关键的处理区域。
         ServletContext sc = request.getSession().getServletContext();//通过HttpServletRequestServletContext
         XmlWebApplicationContext cxt =(XmlWebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(sc);
         if(cxt != null && cxt.getBean("systemService") != null && systemService== null)
         systemService= (SystemService ) cxt.getBean("systemService");
       TUser user = this.systemService.findHql("from TUser  where userName='admin' ");//此时就不会为null了。
       chain.doFilter(request, response);
 }

2.2、解决方案二如下所示:

public class SessionFilter implements Filter{
   private SystemService systemService;
    public void init(FilterConfig fConfig) throws ServletException {
        ServletContext sc = fConfig.getServletContext(); 
        XmlWebApplicationContext cxt = (XmlWebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(sc);
        if(cxt != null && cxt.getBean("systemService") != null && systemService== null)
            systemService= (SystemService ) cxt.getBean("systemService");        
    }

      相关原理:
      2.2.1如何获取 ServletContext:
      1)在javax.servlet.Filter中直接获取
      ServletContext context = config.getServletContext();
      2)在HttpServlet中直接获取
      this.getServletContext()
      3)在其他方法中,通过HttpServletRequest获得
      request.getSession().getServletContext();
      2.2.2 WebApplicationContext 与 ServletContext (转自:http://blessht.iteye.com/blog/2121845):
      Spring的 ContextLoaderListener是一个实现了ServletContextListener接口的监听器,在启动项目时会触发contextInitialized方法(该方法主要完成ApplicationContext对象的创建),在关闭项目时会触发contextDestroyed方法(该方法会执行ApplicationContext清理操作)。ConextLoaderListener加载Spring上下文的过程
      ①启动项目时触发contextInitialized方法,该方法就做一件事:通过父类contextLoader的initWebApplicationContext方法创建Spring上下文对象。
      ②initWebApplicationContext方法做了三件事:创建 WebApplicationContext;加载对应的Spring文件创建里面的Bean实例;将WebApplicationContext放入 ServletContext(就是Java Web的全局变量)中。
      ③createWebApplicationContext创建上下文对象,支持用户自定义的上下文对象,但必须继承自ConfigurableWebApplicationContext,而Spring MVC默认使用ConfigurableWebApplicationContext作为ApplicationContext(它仅仅是一个接口)的实 现。
      ④configureAndRefreshWebApplicationContext方法用 于封装ApplicationContext数据并且初始化所有相关Bean对象。它会从web.xml中读取名为 contextConfigLocation的配置,这就是spring xml数据源设置,然后放到ApplicationContext中,最后调用传说中的refresh方法执行所有Java对象的创建。
      ⑤完成ApplicationContext创建之后就是将其放入ServletContext中,注意它存储的key值常量。
2.2、解决方案三如下所示:
      HandlerInterceptor或者HandlerInterceptorAdapter 来替换Filter。

public class SessionInterceptor implements HandlerInterceptor {
    @Autowired
    private SystemService systemService;   
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // TODO Auto-generated method stub
        return false;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception {
        // TODO Auto-generated method stub
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // TODO Auto-generated method stub
    }
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
当使用UiAutomator框架调用Accessibility Service时,可以使用以下代码示例: ```java import android.accessibilityservice.AccessibilityService; import android.content.Intent; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; public class MyAccessibilityService extends AccessibilityService { @Override public void onAccessibilityEvent(AccessibilityEvent event) { // 在这里处理来自Accessibility Service的事件 // 例如,获取当前活动窗口的根节点 AccessibilityNodeInfo rootNode = getRootInActiveWindow(); if (rootNode != null) { // 进行节点遍历,查找特定的控件 AccessibilityNodeInfo targetNode = findNodeById(rootNode, "com.example.app:id/myButton"); if (targetNode != null) { // 在这里执行你的操作,比如点击按钮 targetNode.performAction(AccessibilityNodeInfo.ACTION_CLICK); } } } @Override public void onInterrupt() { // 在这里处理服务中断的情况 } @Override protected void onServiceConnected() { super.onServiceConnected(); // 在这里执行初始化操作,例如注册监听器 } @Override public boolean onUnbind(Intent intent) { // 在这里执行清理操作,例如注销监听器 return super.onUnbind(intent); } // 辅助方法:通过控件ID查找节点 private AccessibilityNodeInfo findNodeById(AccessibilityNodeInfo rootNode, String id) { if (rootNode == null) { return null; } if (rootNode.getViewIdResourceName() != null && rootNode.getViewIdResourceName().equals(id)) { return rootNode; } for (int i = 0; i < rootNode.getChildCount(); i++) { AccessibilityNodeInfo childNode = rootNode.getChild(i); AccessibilityNodeInfo targetNode = findNodeById(childNode, id); if (targetNode != null) { return targetNode; } } return null; } } ``` 在此示例中,我们创建了一个名为`MyAccessibilityService`的类,它扩展了`AccessibilityService`。在`onAccessibilityEvent`方法中,我们可以处理来自Accessibility Service的事件。我们可以使用`getRootInActiveWindow`方法获取当前活动窗口的根节点,并使用`findNodeById`辅助方法查找特定的控件节点。如果找到了目标节点,我们可以执行相应的操作,比如点击按钮。 请注意,为了让应用程序使用我们的Accessibility Service,还需要在AndroidManifest.xml文件中声明和注册该服务: ```xml <service android:name=".MyAccessibilityService" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/accessibility_service_config" /> </service> ``` 上述代码示例仅用于演示如何使用UiAutomator调用Accessibility Service。实际使用中,您可能需要根据自己的应用程序和需求进行适当的修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值