无法通过使用@RequiredArgsConstructor或@AllArgsConstructor来摆脱@Autowired

问题描述 投票:0回答:2

我有以下代码:

// @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 错误

java spring spring-boot dependency-injection lombok
2个回答
1
投票

只需使用构造函数注入即可。如果您的 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
手动执行(删除整个方法)。


0
投票

从Spring 4.3版本开始,单个bean构造函数不需要使用@Autowired注解。 使用 Lombok,可以为所有类的字段(使用 @AllArgsConstructor)或所有最终类的字段(使用 @RequiredArgsConstructor)生成构造函数。

© www.soinside.com 2019 - 2024. All rights reserved.