java - 尝试在 JAVA Spring,@AutoWired 过滤器服务,但抛出 NPE
问题描述
我的项目是使用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 为空?欢迎任何提示,并且有示例代码将是完美的。
感谢您的帮助。
最后,我找到了一种让它工作的方法,它在过滤器类中使用 DelegatingFilterProxy 而不是 Class 本身。
可以看到上面的代码是主块。
解决方案
为什么它为空可能有很多原因。我会检查以下内容:
只有当类本身 (ConvertNickNameToRealNameFilter) 由 spring 管理时,才会在 spring 中自动装配。我确实看到你在上面放了一个“组件”,但是类似的代码
chain.doFilter
可能暗示你实际上正在使用 java servlet 的过滤技术,它没有与 spring MVC 集成(实际上 spring MVC 是建立在低-级别的 servlet)。有可能该类没有放在弹簧的“组件扫描过程”未处理的包中 - 所以弹簧不加载它,代码是否进入它?
如果一切都由 spring 管理,请确保没有在不同的应用程序上下文中处理存储库和过滤器
总而言之,我建议使用 Spring mvc 拦截器而不是普通过滤器。这些与 Spring MVC 集成。有关它们之间的差异,请参见此链接
推荐阅读
- java - 程序 6 of 49 前 6 个不包含重复,第 7 个数字必须不是第 6 个中的一个
- node.js - 如何使用 nodeJS 将 DynamicsCRM 与 botframework v4 集成?
- python - 两个实例引用同一个对象问题
- ios - 如何在函数中返回 CLLocationManager didUpdateLocations 的值?
- firebase - Firebase跨平台推送通知插件复制MainActivity
- mysql - 在 docker 容器 laravel mysql 中运行迁移文件
- java - 正则表达式读取以下格式化字符串模式
- javascript - 我在将对象添加到数组时遇到问题
- python - 重复的级别名称:“日期”,分配给级别 1,已用于级别 0
- ios - build_iphone.sh:第 52 行:/Users/.../pocketsphinx-master/configure:没有这样的文件或目录