You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中JwtUtil Bean创建失败:自动注入依赖出错

问题描述

开发基于JWT的Spring Boot应用时,启动报错:Error creating bean with name 'jwtUtil': Injection of autowired dependencies failed,即使已经给JwtUtil类添加了@Component注解仍然出现该问题。

JwtUtil类代码

@Component
public class JwtUtil {
    
    @Value("${jwt.secret}")
    private String secret;
    
    @Value("${jwt.expiration}")
    private Long expiration;
    
    public String generateToken(String username, String role) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("role", role);
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + expiration))
                .signWith(SignatureAlgorithm.HS512, secret)
                .compact();
    }
}

Controller类代码

@Controller
@RequestMapping("/api")
public class LoginPageController {
    
    @Autowired
    private AuthenticationManager authenticationManager;
    
    @Autowired
    private LoginPageServiceImpl userDetailService;
    
    @Autowired
    private JwtUtil jwtUtil;
    
    @GetMapping("/login")
    public String login() {
        return "login";
    }
}

控制台错误日志

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
[2m2023-06-09T12:45:52.021+05:30[0;39m [31mERROR[0;39m [35m384[0;39m [2m---[0;39m [2m[  restartedMain][0;39m [36mo.s.boot.SpringApplication              [0;39m [2m:[0;39m Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jwtUtil': Injection of autowired dependencies failed
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:488) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1416) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:597) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:941) ~[spring-context-6.0.9.jar:6.0.9]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:608) ~[spring-context-6.0.9.jar:6.0.9]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:733) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:435) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:311) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1305) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1294) ~[spring-boot-3.1.0.jar:3.1.0]
    at com.example.demo.LoginPageApplication.main(LoginPageApplication.java:10) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-3.1.0.jar:3.1.0]
解决方案

这个错误核心是Spring无法注入@Value标注的jwt.secret和jwt.expiration属性,导致JwtUtil Bean创建失败,按以下步骤排查修复:

  • 检查配置文件是否存在对应属性
    在application.properties或application.yml中确认配置了这两个属性:

    # application.properties示例
    jwt.secret=your_strong_secret_key_here
    jwt.expiration=86400000 # 24小时,单位毫秒
    

    或yml格式:

    # application.yml示例
    jwt:
      secret: your_strong_secret_key_here
      expiration: 86400000
    
  • 确保配置文件被Spring正确加载
    配置文件需放在src/main/resources目录下,Spring Boot默认加载该目录下的配置文件。如果是自定义路径,需通过@PropertySource注解指定:

    @Component
    @PropertySource("classpath:custom-config.properties") // 替换为你的配置文件路径
    public class JwtUtil {
        // ... 原有代码
    }
    
  • 处理属性类型不匹配问题
    确认jwt.expiration配置的值是数字类型,不能是带引号的字符串,否则会导致Long类型注入失败。

  • 检查组件扫描范围
    确保JwtUtil类所在的包被Spring组件扫描覆盖。如果主启动类LoginPageApplication的包是com.example.demo,JwtUtil需放在com.example.demo或其子包下;否则在主启动类添加@ComponentScan指定扫描包:

    @SpringBootApplication
    @ComponentScan(basePackages = {"com.example.demo", "your.jwt.util.package"})
    public class LoginPageApplication {
        public static void main(String[] args) {
            SpringApplication.run(LoginPageApplication.class, args);
        }
    }
    
  • 添加默认值避免注入失败
    给@Value设置默认值,防止配置缺失时直接报错:

    @Value("${jwt.secret:default_secret_key}")
    private String secret;
    
    @Value("${jwt.expiration:86400000}")
    private Long expiration;
    

内容的提问来源于stack exchange,提问作者A_B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 06:55:02