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