プロジェクトで問題が発生しました。フィルターへのサービスの注入が失敗し、注入されたサービスは常に null でした。以下に示すように:
public class WeiXinFilterimplements Filter{
@Autowired
private UsersService usersService;
public void doFilter(ServletRequest request, ServletResponse response, FilterChainchain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request ;
HttpServletResponse resp = (HttpServletResponse)response;
Users users = this.usersService.queryByOpenid(openid);
}
上記の usersService は null ポインタ例外を報告します。
解決策 1:
public void doFilter(ServletRequest request, ServletResponse response, FilterChainchain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponce resp = (HttpServletResponse)応答; ServletContext sc = 要求.getSession().getServletContext(); = null && usersService == null)
UsersService = (Usersservice) CXT.GetBean ("Usersservice");
ユーザー users = this.usersservice.querybyopenid (openid);
方法 2:
public class WeiXinFilter は Filter{
private UsersService usersService;public void init(FilterConfig fConfig) throws ServletException {
ServletContext sc = fConfig.getServletContext( );XmlWebApplicationContext cxt = ( XmlWebApplicationContext)WebApplicationContextUtils。 getWebApplicationContext(sc); )
関連原則:
1. ServletContext の取得方法:
1) javax.servlet.Filter で直接取得します。
ServletContext context = config.getServletContext(); HttpServlet で直接取得します
this.getServletContext( )
request.getSession().getServletContext();
2. WebApplicationContext と ServletContext を取得します (http://blessht.iteye. com/blog/2121845) HttpServletRequest 経由:
Spring の ContextLoaderListener は、ServletContextListener インターフェイスを実装するリスナーです。プロジェクトの開始時に、contextInitialized メソッドがトリガーされます (このメソッドは主に、プロジェクトの開始時に ApplicationContext オブジェクトの作成を完了します)。閉じられると、contextDestroyed メソッドがトリガーされます (このメソッドは ApplicationContext のクリーンアップ操作を実行します)。
ConextLoaderListenerによるSpringコンテキストの読み込み処理
①プロジェクトの開始時にcontextInitializedメソッドがトリガーされます。このメソッドは、親クラスcontextLoaderのinitWebApplicationContextメソッドを通じてSpringコンテキストオブジェクトを作成することを1つ行います。
② initWebApplicationContext メソッドは 3 つのことを行います: WebApplicationContext を作成し、対応する Spring ファイルをロードして内部に Bean インスタンスを作成し、WebApplicationContext を ServletContext (Java Web のグローバル変数) に置きます。
③createWebApplicationContext はコンテキスト オブジェクトを作成し、ユーザー定義のコンテキスト オブジェクトをサポートしますが、これらは ConfigurableWebApplicationContext から継承する必要があり、Spring MVC はデフォルトで ConfigurableWebApplicationContext を ApplicationContext (単なるインターフェイス) の実装として使用します。
を置き換えます
public class WeiXinInterceptor は HandlerInterceptor {
@Autowired private UsersService usersService; を実装します。
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO 自動生成メソッドスタブ
return false;
}
@Override public void postHandle(HttpServletRequest リクエスト、HttpServletResponse レスポンス、オブジェクト ハンドラー, ModelAndView modelAndView) throws Exception { // TODO 自動生成メソッド スタブ
}
@Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws ion { // TODO 自動生成メソッドスタブ
}
}
/>
public class WeiXinFilter は Filter{
private UsersService usersService; を実装します。
public void init(FilterConfig fConfig) throws ServletException {} public WeiXinFilter() {} public void destroy() {} public void doFilter(ServletRequest request, ServletResponse response, FilterChainchain) throws IOException, ServletException {
HttpServletRequest req = (H ttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse)response;
String userAgent = req.getHeader("user-agent"); if(useragent!= null && useragent.tolowercase()。indexof( "micromessenger")!= -1){// toString();
String queryString = req.getQueryString();
if(queryString != null){ if(requestURL.indexOf("mtzs.html") !=-1 && queryString.indexOf("LLFlag")!=-1){
req.getSession() .setAttribute(" LLFlag", "1");
chain.doFilter(リクエスト, レスポンス); return;
}
}
String openidDES = CookieUtil.getValueByName("openid", req);
String openid = null; if(StringUtils.isNotBlank(openidDES)){ 試してみてください {
openid = DesUtil.decrypt(openidDES, "rxxxxxxxxxde"); // 解密获得openid
} catch (Exception e) {
e.printStackTrace();
}
}
// ... ...
String[] pathArray = {"/weixin/enterAppFromWeiXin.json", " /weixin/getWeiXinUserInfo.json", "/weixin/getAccessTokenAndOpenid.json", "/sendRegCode.json", "/register.json",
「/login.json」、「/logon.json」、「/dump. json", "/queryInfo.json"};
List
String loginSuccessUrl = req.getParameter("path");
String fullLoginSuccessUrl = "http://www.axxxxxxx.cn/pc/"; if(requestURL.indexOf("weixin_gate.html") != -1){
req.getSession().setAttribute("loginSuccessUrl", loginSuccessUrl);
// ... ...
}
ServletContext sc = req .getSession().getServletContext();
XmlWebApplicationContext cxt = (XmlWebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(sc);
if(cxt != null && cxt.getBean("usersService") != null && usersService == null)
usersService = (UsersService) cxt.getBean("usersService");
ユーザー users = this.usersService.queryByOpenid(openid);
// ... ... if(pathList.contains(servletPath)){ / /パスリスト中的访问路直通
chain.doFilter(リクエスト、レスポンス); String llFlag = (String) req.getSession() .getAttribute("LLFlag"); if(llFlag ! = null && llFlag.equals("1")){戻る;
。 .// 3. Tencent ServerからWeChatのOpenIDを取得します。