我在阅读配置时遇到了一个奇怪的问题,我见过的解决方案似乎都不起作用。这是我的代码:
@SpringBootApplication
@EnableConfigurationProperties
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
这是我的属性类
@Component
@ConfigurationProperties(prefix = "my")
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class MyProperties {
private String host;
private int port;
}
然后我使用@Autowired 在我的类中使用 MyProperties 类:
@Autowired
private MyProperties props;
但是,我的props对象为空。
奇怪的是,这完美地通过了测试:
@SpringBootTest
class ApplicationTests {
@Autowired
private MyProperties props;
@Test
void test_configuration() {
Assertions.assertEquals(props.getHost(), "xx.xx.xx.xx");//pass!
Assertions.assertEquals(props.getPort(), xxxxxx);//pass!
}
}
它完全拒绝工作,@Value 注入也是如此。我会错过什么?
编辑
这是我如何在 MyProperties 上使用 @Autowired 的完整代码(我已经包含了 @Value 也不起作用)
@Slf4j
@Component //also tried @Configurable, @Service
public class MyService {
@Autowired
private MyProperties props;
@Value("localhost")
public String host;
public void post() {
log.info(host + props);// =null and null
}
}
编辑2
但是,我注意到在控制器上,它工作得很好:
@Slf4j
@RestController
@Service
public class Main {
@Autowired
private MyProperties props;
@Value("localhost")
private String host;
@GetMapping("/post")
public void post() {
log.info(host + props);//=it's perfect!
new MyService().post();// calling MyService - where @Autowired or @Value is failing
}
}