我有以下代码:
// @RequiredArgsConstructor
// @AllArgsConstructor
@NoArgsConstructor
public class AuthTokenFilter extends OncePerRequestFilter {
@Autowired
private final JwtUtils jwtUtils;
// private final JwtUtils jwtUtils;
@Autowired
private UserDetailsServiceImpl userDetailsService;
// private final UserDetailsServiceImpl userDetailsService;
private static final Logger logger = LoggerFactory.getLogger(AuthTokenFilter.class);
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
try {
String jwt = parseJwt(request);
if (jwt != null && jwtUtils.validateJwtToken(jwt)) {
String username = jwtUtils.getUserNameFromJwtToken(jwt);
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(
userDetails,
null,
userDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
}
} catch (Exception e) {
logger.error("Cannot set user authentication: {}", e);
}
filterChain.doFilter(request, response);
}
private String parseJwt(HttpServletRequest request) {
String headerAuth = request.getHeader("Authorization");
if (StringUtils.hasText(headerAuth) && headerAuth.startsWith("Bearer ")) {
return headerAuth.substring(7, headerAuth.length());
}
return null;
}
}
我试图通过使用代码中注释的
@Autowired
或@RequiredArgsConstructor
来摆脱@AllArgsConstructor
。但是,由于最终字段可能未初始化,因此我收到指示此问题的错误。为此,我也可以将 jwtUtils
和 userDetailsService
设置为 null,但我不确定这是否是一个好主意。那么,我可以使用构造函数注释(lombok)来摆脱此示例中的 @Autowired
吗?
更新:当使用建议的方法时,我在其他类中的这个bean中遇到错误:
@Bean
public AuthTokenFilter authenticationJwtTokenFilter() {
return new AuthTokenFilter();
}
预期有 2 个参数,但发现 0 错误
只需使用构造函数注入即可。如果您的 bean 恰好有一个构造函数,则 spring 的行为就像它具有
@Autowired
,即使它没有显式添加。
@AllArgsConstructor
@Component
public class AuthTokenFilter extends OncePerRequestFilter {
private final JwtUtils jwtUtils;
private final UserDetailsServiceImpl userDetailsService;
private static final Logger logger = LoggerFactory.getLogger(AuthTokenFilter.class);
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
//method implementation
}
}
编辑:在类上添加
@Component
,spring将为您初始化bean,无需使用@Bean
手动执行(删除整个方法)。
从Spring 4.3版本开始,单个bean构造函数不需要使用@Autowired注解。 使用 Lombok,可以为所有类的字段(使用 @AllArgsConstructor)或所有最终类的字段(使用 @RequiredArgsConstructor)生成构造函数。