2016-07-25 50 views
0

我在访问应该已经注入Interceptor的应用程序映射时遇到了NullPointerException,因为我实现了ApplicationAware接口。如何在自定义拦截器中使用Application范围变量?

public String intercept(ActionInvocation ai) throws Exception { 
    String result = "expire"; 
    app.put("login_msg", "Session Expired"); 
    Map session = ai.getInvocationContext().getSession(); 

    try { 
     if ((session != null && session.get("login").toString().equalsIgnoreCase("true")) || !app.get("db_name").toString().equals("")) { 
     log.info("login hai"); 
     app.put("login_msg", ""); 
     result = ai.invoke(); 
     } else { 
      log.error(" LOGIN EXPIRED "); 
     } 
    } catch (NullPointerException npe) { 
     log.error("Error : " + npe); 
    } 

    log.info("Interceptor Result : " + result); 
    return result; 
} 

@Override 
public void setApplication(Map<String, Object> map) { 
    app = map; 
} 
+1

你(试图)明确地说“会话”,如在登录会话中的字符串,显式称为“应用程序”应该是一个巨大的红色警告标志,可能在思维过程中出现了问题。 –

+0

@HarshdeepSingh这已经是另一个问题了。 –

回答

2

ApplicationAware是用来注入一个全球地图为行动,而不是拦截器的接口:

操作希望了解应用程序映射对象应该实现此接口。这将使他们能够访问一个地图,在那里他们可以将应该可用于应用程序其他部分的对象。

有复式的方式来实现你想要什么,但我敢肯定它不是你需要。为什么你将登录信息放入全局对象?只要写入和读取会话,这就是你需要的。

+0

你还有怀疑@harshdeep吗? –

+0

感谢您的这位好友!我只使用会话,但仍然无法将消息(已在拦截器中设置)打印到重定向的jsp页面。其实这是检查登录会话,如果会话过期,它会将其重定向到登录页面。我想在该页面上打印“Session Expired”消息。请帮忙。 –

+0

听起来像是一个新问题,BTW''会打印出'foo'值。 –