在JavaSpring中尝试,@autowiredfilter服务,但抛出npe

b0zn9rqh  于 2021-06-08  发布在  Redis
关注(0)|答案(1)|浏览(281)

我的项目使用spring框架来处理http请求和响应。我有一个请求,将一些参数替换为redis或数据库中依赖于其中一个参数的值。
笔者调查的大部分相关案例都是用过滤器来达到目的的。
例如,有两个参数customername:,我snickname:true of 应用程序编程接口。我尝试实现一个扩展onceperrequestfilter类的类,如下所示。

@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>

我尝试使用@autowiredannotation注入dao和repo,但失败了。如何处理dao和repo为空?任何提示将是受欢迎的,有样本代码将是完美的。
谢谢你的帮助。
最后,我找到了一种方法,在filter类中使用delegatingfilterproxy而不是类本身。
可以看到上面的代码,这是主块。

l7mqbcuq

l7mqbcuq1#

它为什么为空有很多原因。我将检查以下内容:
只有当类本身(ConvertNicknomToRealNameFilter)由spring管理时,spring中才会发生自动连接。我确实看到你在上面加了一个“组件”,但是 chain.doFilter 可能暗示您实际上使用的是JavaServlet的过滤技术,它没有与SpringMVC集成(实际上SpringMVC构建在低级servlet之上)。
有可能这个类没有放在一个包中,而这个包不是由spring的“组件扫描过程”处理的——这样spring就不会加载它,代码是否会进入它?
如果一切都是由spring管理的,请确保没有在不同的应用程序上下文中处理存储库和过滤器
总之,我建议使用springmvc拦截器,而不是普通的过滤器。它们与springmvc集成。请参阅此链接以了解它们之间的差异

相关问题