Spring Boot配置类无法在运行时进行Wire ConfigurationProperties



Java 8和Spring Boot 1.5.8这里。我有以下application.properties文件:

logging:
  config: 'logback.groovy'
myapp:
  hystrixTimeoutMillis: 500
  jwt:
    expiry: 86400000
    secret: 12345
  machineId: 12345
spring:
  cache:
    type: none

映射到以下@ConfigurationProperties POJO:

@ConfigurationProperties(prefix = "myapp")
public class MyAppConfig {
  private Jwt jwt;
  private Long hystrixTimeoutMillis;
  private String machineId;
  public Jwt getJwt() {
    return jwt;
  }
  public void setJwt(Jwt jwt) {
    this.jwt = jwt;
  }
  public Long getHystrixTimeoutMillis() {
    return hystrixTimeoutMillis;
  }
  public void setHystrixTimeoutMillis(Long hystrixTimeoutMillis) {
    this.hystrixTimeoutMillis = hystrixTimeoutMillis;
  }
  public String getMachineId() {
    return machineId;
  }
  public void setMachineId(String machineId) {
    this.machineId = machineId;
  }
  public static class Jwt {
    private Long expiry;
    private String secret;
    public Long getExpiry() {
      return expiry;
    }
    public void setExpiry(Long expiry) {
      this.expiry = expiry;
    }
    public String getSecret() {
      return secret;
    }
    public void setSecret(String secret) {
      this.secret = secret;
    }
  }
}

我有以下@Configuration(喷油器)类:

@Configuration
public class MyAppInjector implements ApplicationContextAware {
  private Logger log = LoggerFactory.getLogger(this.getClass());
  private ApplicationContext applicationContext;
  @Autowired
  private MyAppConfig myAppConfig;
  @Bean
  public AuthService authService(MyAppConfig myAppConfig) {
    return new JwtAuthService(myAppConfig);
  }
}

和以下JwtAuthService类:

public class JwtAuthService implements AuthService {
  private static final String BEARER_TOKEN_NAME = "Bearer";
  private Logger log = LoggerFactory.getLogger(this.getClass());
  private MyAppConfig myAppConfig;
  @Autowired
  public JwtAuthService(MyAppConfig myAppConfig) {
    this.myAppConfig = myAppConfig;
  }
  @Override
  public boolean isValidAuthToken(String authToken) {
    return true;
  }
}

在启动时,我会收到以下错误:

***************************
APPLICATION FAILED TO START
***************************
Description:
Field myAppConfig in com.example.myapp.spring.MyAppInjector required a bean of type 'com.example.myapp.spring.MyAppConfig' that could not be found.
Action:
Consider defining a bean of type 'com.example.myapp.spring.MyAppConfig' in your configuration.

为什么我会遇到此错误?我在哪里注射/配置事物?

您并未将MyAppConfig声明为示例中任何地方的bean, @ConfigurationProperties不会使带注释的类abe a bean。您可以作为MyAppInjector配置的一部分进行操作:

@Configuration
public class MyAppInjector {
  @Bean
  public AuthService authService() {
    return new JwtAuthService(myAppConfig());
  }
  @Bean
  public MyAppConfig myAppConfig() {
    return new MyAppConfig();
  }
} 

带有@configurationProperties的类也应该是bean。您需要注释为@component,或用@Bean注释在@configuration类中手动注册(而不是尝试在此处自动自动)

相关内容

  • 没有找到相关文章

最新更新