我在Spring-boot Configuration(用@Configuration注释)类中定义了这样的Bean:
@Bean
public MyRegistry myRegistry() {
return new MyRegistry();
}
MyRegistry 看起来像这样:
@Component
@Getter
@Setter
public class MyRegistry {
Map<String, Object> resourcesMap = new HashMap<>();
public MyRegistry() {
resourcesMap.put("handler1", new MyHandler1());
resourcesMap.put("handler2", new MyHandler2());
}
}
现在,在另一个带有 @Component 的类中,我已经 @Autowired myRegistry 并按如下方式使用它:
MyHandler1 handler1 = new ObjectMapper().convertValue(myRegistry.getResourcesMap().get("handler1"), MyHandler1.class);
启动 Spring-Boot 应用程序时没有收到任何错误,但应用程序运行时,无法访问 Handler1 的方法。
想了解我在这里做错了什么。我可能搞乱了注释的使用,因为我是 Spring-Boot 的新手
最佳答案
那么下面的代码(snippet1)可以工作吗?
Object mHandler1Obj = myRegistry.getResourcesMap().get("handler1", MyHandler1.class);
但是当你尝试(snippet2)时它会失败:
MyHandler1 handler1 = new ObjectMapper().convertValue(myHandler1Obj);
如果是这样,那么 Spring Boot 在这里就无关紧要了,“snippet1”工作的事实已经表明 Spring Boot 已经完成了它的工作。
现在它的对象映射器无法将通用对象转换为 MyHandler1...
为了重现它,请尝试从等式中“排除” Spring Boot 并仅检查 snippet2
这个顺便说一句可以解释为什么应用程序上下文(spring boot应用程序)启动时没有异常:如果它不能 Autowiring 某些东西,它将在启动过程中失败,但正如你所解释的那样,情况并非如此......
关于Java Spring启动: Not able to access @Bean defined in @Configuration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60088420/