在JAVA Spring中尝试使用@AutoWired Filter服务,但会抛出NPE

问题描述

我的项目正在使用spring框架来处理http请求和响应。 我有一个要求,将其中一些参数替换为Redis或数据库中的值,具体取决于其中一个参数。

我调查的大多数相关案件都是使用过滤器达到目的的。

例如,api有两个参数customerName:abc,isNickName:true。 然后,我尝试实现一个扩展了EveryPerRequestFilter类的类,如下所示。

@Component("myFilter")
public class ConvertNickNameToRealNameFilter extends OncePerRequestFilter{

  @AutoWired
  private CustomerDao customerDao;

  @AutoWired
  private CustomerRepository customerRepository;

  protected abstract void doFilterInternal(HttpServletRequest request,HttpServletResponse response,FilterChain filterChain) throws ServletException,IOException {

    ...
    If (isNickName){
      customerName = getRealName(customerName); 
    }
    chain.doFilter(request,response);
    ...

  }

  // repo = repository = redis
  // dao = database
  public String getRealName(String nickName){
    String realName = customerRepository.getRealName(nickName);
    if(realName == null) {
      Customer c = customerDao.findByNickName(nickName);
      if(c != null){
        customerRepository.set(nickName,c.getRealName());
        return (c == null) ? "" : c.getRealName();
      }
    }else{
      return realName;
    }
  }
}

在web.xml中

<filter>
  <filter-name>myFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
  <filter-name>myFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

我尝试使用@AutoWired注释注入dao和repo,但是失败了。 如何处理dao和repo为null? 任何提示都将受到欢迎,并且示例代码将是完美的。

谢谢您的帮助。


最后,我找到了一种使其工作的方法,该方法在过滤器类中使用DelegatingFilterProxy而不是Class本身。

可以看到上面的代码是主要代码。

解决方法

其为null的原因可能有很多。我会检查以下内容:

  1. 仅当类本身(ConvertNickNameToRealNameFilter)由spring管理时,才会在spring中自动布线。我确实看到您已经在其上放了一个“组件”,但是类似chain.doFilter的代码可能暗示您实际上是在使用Java Servlet的过滤技术,该技术未与Spring MVC集成(事实上,Spring MVC是内置的在低级servlet之上。

  2. 是否有可能没有将类放入未由spring的“组件扫描过程”处理的包中-以便spring不会加载它,代码是否完全进入了它? / p>

  3. 如果一切都由spring管理,请确保没有在不同的应用程序上下文中处理存储库和过滤器

总而言之,我建议使用Spring mvc拦截器,而不是普通过滤器。这些与Spring MVC集成在一起。 See this link找出两者之间的差异

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...