尝试在 JAVA Spring,@AutoWired 过滤器服务,但抛出 NPE

Posted

技术标签:

【中文标题】尝试在 JAVA Spring,@AutoWired 过滤器服务,但抛出 NPE【英文标题】:Try in JAVA Spring, @AutoWired Filter service but throws NPE 【发布时间】:2020-12-16 12:07:46 【问题描述】:

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

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

比如api有两个参数customerName:abc,isNickName:true。 我尝试实现一个扩展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>

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

感谢您的帮助。


最后,我找到了一种让它工作的方法,它在 filter-class 中使用 DelegatingFilterProxy 而不是 Class 本身。

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

【问题讨论】:

【参考方案1】:

为什么它为空可能有很多原因。我会检查以下内容:

    只有当类本身 (ConvertNickNameToRealNameFilter) 由 spring 管理时,才会在 spring 中自动装配。我确实看到你在上面放了一个“组件”,但是像chain.doFilter 这样的代码可能暗示你实际上是在使用 java servlet 的过滤技术,它没有与 spring MVC 集成(实际上 spring MVC 是建立在上面的低级 servlet)。

    有可能这个类没有放在一个没有被spring的“组件扫描过程”处理的包中——所以spring没有加载它,代码是否进入了它?

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

总而言之,我建议使用 Spring mvc 拦截器而不是普通过滤器。这些与 Spring MVC 集成。 See this link 了解它们之间的差异

【讨论】:

嗨,马克,谢谢你的慷慨回答。 1.是的,过滤器是基于selvet的,我想将它集成到spring MVC中。最后,我尝试使用 DelegatingFilterProxy 来实现它。 2.所有代码都进入一个项目。 3. 只有一个应用上下文,而且好像之前的配置没有应用在spring上下文中。我想看看你分享的信息。

以上是关于尝试在 JAVA Spring,@AutoWired 过滤器服务,但抛出 NPE的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security Autowire 数据源 Javaconfig

Spring Data Rest:自定义 JsonDeserializer 中的 @Autowire

Spring Autowire

spring中autowire的用法

wicket,spring jpa存储库 - @Autowire上的nullpointer

[Spring] Autowire