【发布时间】: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 本身。
可以看到上面的代码是主块。
【问题讨论】:
标签: java spring filter redis dao