Мой проект использует структуру Spring для обработки http-запроса и ответа. У меня есть запрос, который заменяет некоторые параметры значением из редиса или базы данных, зависящей от одного из параметров.
Я рассматриваю большинство связанных случаев, которые используют фильтр для достижения цели.
Например, есть два параметра customerName:abc, isNickName:true API. И я пытаюсь реализовать класс, который расширяет класс 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;
}
}
}
в веб.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 и репо, но не смог. Как справиться с тем, что дао и репо являются нулевыми? Любая подсказка будет приветствоваться, и образец кода будет идеальным.
Спасибо вам за помощь.
Наконец, я нашел способ заставить его работать, который использует DelegatingFilterProxy в классе фильтра вместо самого класса.
Можно увидеть код выше, который является основным блоком.