在java class中定义了一个全局静态变量,使用过程中这个静态值突然没了,报出了NullPointException的错

王.者.归.来 发布于 2015/03/24 09:17
阅读 2K+
收藏 0

解读下一代网络:算力网络正从理想照进现实!>>>

    在java class中定义了一个全局静态变量,使用过程中这个静态值突然没了,报出了NullPointException的错。环境:spring mvc + quartz + ibatis。

    

    private static Map<String, String> tokenMap = new LinkedHashMap<String, String>();
    
    private static Map<String, Long> tokenExpiresTimeMap = new LinkedHashMap<String, Long>();
    
    private static Map<String, Long> tokenCreateTimeMap = new LinkedHashMap<String, Long>();


    /**
     * 从微信服务器获取ACCESS TOKEN
     * 
     * @param wxh [参数说明]
     * @return void [返回类型说明]
     * @see [类、类#方法、类#成员]
     */
    private static void getTokenFromRemote(String wxh)
    {
        try
        {
            WeixinInfo weixinInfo = weixinInfoMap.get(wxh);
            
            if (weixinInfo == null)
            {
                return;
            }
            
            String appId = weixinInfo.getAppId();
            String appSecret = weixinInfo.getAppSecret();
            
            String getAccessTokenPath = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
                + appId + "&secret=" + appSecret;
            
            WeiXinAccessTokenEntity weiXinAccessToken = HttpDispatch.getInstance()
                .sendGetRequestReturnObj(getAccessTokenPath, WeiXinAccessTokenEntity.class);
            
            String strAccessToken = weiXinAccessToken.getAccess_token();
            Long lExpiresIn = 0L;
            Long lCreateTime = 0L;
            
            if (StringUtils.isNotBlank(strAccessToken))
            {
                lExpiresIn = Long.parseLong(weiXinAccessToken.getExpires_in()) * 1000;
                lCreateTime = new Date().getTime();
                
                tokenMap.put(wxh, strAccessToken);
                tokenExpiresTimeMap.put(strAccessToken, lExpiresIn);
                tokenCreateTimeMap.put(strAccessToken, lCreateTime);
                
                saveAccessToken(wxh, strAccessToken, lExpiresIn, lCreateTime);
            }
            else
            {
                log.error("errcode : " + weiXinAccessToken.getErrcode() + " , errmsg : "
                    + weiXinAccessToken.getErrmsg());
            }
        }
        catch (Exception e)
        {
            log.error(CommonUtils.getStackMessage(e));
        }
    }
    
    /**
     * 保存ACCESS TOKEN
     * 
     * @param wxh
     * @param accessToken
     * @param expiresIn
     * @param createTime [参数说明]
     * @return void [返回类型说明]
     * @see [类、类#方法、类#成员]
     */
    private static void saveAccessToken(String wxh, String accessToken, Long expiresIn, Long createTime)
    {
        InputStream is = null;
        OutputStream os = null;
        Properties properties = new Properties();
        
        try
        {
            String targetFileName = String.format(fileName, wxh);
            is = WeiXinAccessTokenContext.class.getClassLoader().getResourceAsStream(targetFileName);
            
            if (is == null)
            {
                String classPath = WeiXinAccessTokenContext.class.getClassLoader().getResource("").getPath();
                
                if (!classPath.endsWith("/"))
                {
                    classPath += "/";
                }
                
                String targetFilePath = classPath + targetFileName;
                
                if (targetFilePath.startsWith("file:/"))
                {
                    targetFilePath = targetFilePath.substring(6);
                }
                
                File targetFile = new File(targetFilePath);
                File parentFile = targetFile.getParentFile();
                
                if (!parentFile.exists())
                {
                    parentFile.mkdirs();
                }
                
                targetFile.createNewFile();
                
                is = WeiXinAccessTokenContext.class.getClassLoader().getResourceAsStream(targetFileName);
            }
            
            properties.load(is);
            
            is.close();
            
            properties.setProperty("create_time", String.valueOf(createTime));
            properties.setProperty("expires_in", String.valueOf(expiresIn));
            properties.setProperty("access_token", accessToken);
            
            URL url = WeiXinAccessTokenContext.class.getClassLoader().getResource(targetFileName);
            File file = new File(url.toURI());
            os = new FileOutputStream(file);
            
            properties.store(os, "update weixin access token");
        }
        catch (Exception e)
        {
            log.error(CommonUtils.getStackMessage(e));
        }
        finally
        {
            FileUtils.closeInputStream(is);
            FileUtils.closeOutputStream(os);
        }
    }


    从微信获取token后,存入本地全局MAP,然后再将token保存到本地文件(saveAccessToken),保存完后,全局变量就被置NULL了。DEBUG后发现,问题出现在saveAccessToken方法,调用输出流前一切正常,调用输出流后异常了,全局变量被置NULL了



加载中
返回顶部
顶部