You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用WebFilter时p:barChart标签触发NullPointerException异常问题咨询

错误诱因

你遇到的空指针异常是编码逻辑疏漏导致的,和Primefaces类库、依赖缺失、过滤器本身能力无关,具体问题出在两处:

  1. 权限路径校验逻辑未做非空判断:你从Session中取出paths属性后直接调用stream()方法,如果Session中该属性不存在、或因Session失效被清空,会直接抛出空指针异常。该异常属于RuntimeException,没有被你当前的catch块捕获,会向上抛给Servlet容器,栈追踪就会指向filterChain.doFilter这一行。
  2. 过滤器逻辑存在分支漏判:你只处理了ServletRequest是HttpServletRequest的场景,如果请求类型不匹配,你既没有执行后续过滤器链,也没有返回响应,会导致部分特殊请求挂起。

Primefaces柱状图触发异常的原因是:图表渲染时会发起匹配/dashboard/*规则的资源/数据请求,该请求会经过你的SecurityFilter,刚好触发了上述的空指针逻辑。

修复方案

  1. 补充paths属性非空校验,空值场景按会话失效处理:
@SuppressWarnings("unchecked")
List<String> paths = (List<String>) req.getSession().getAttribute("paths");
// 新增非空判断
if (paths == null) {
    HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
    httpResponse.sendRedirect(req.getContextPath() + "/error/expired.xhtml");
    return;
}
boolean valContext = paths.stream().anyMatch(currentModule::endsWith);
  1. 补全非HttpServletRequest场景的处理逻辑:
if (servletRequest instanceof HttpServletRequest) {
    // 原有逻辑保持不变
} else {
    // 非HTTP请求直接放行
    filterChain.doFilter(servletRequest, servletResponse);
}
  1. 可选择性添加Primefaces资源请求白名单,减少不必要的校验逻辑:在过滤器开头判断请求URI如果是JSF静态资源、Primefaces组件资源,直接跳过校验执行过滤器链即可。

内容的提问来源于stack exchange,提问作者Dagon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 04:27:03