当前位置: 首页 > 知识库问答 >
问题:

Java Sprint引导:无法访问@配置中定义的@Bean

单于正业
2023-03-14

我在Spring boot配置(用@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的新手

共有2个答案

都乐逸
2023-03-14

您已经使用@组件将MyRegistry定义为bean,除非您想创建多个bean,否则不需要使用@配置创建bean。

我尝试了下面的代码,它正在工作,我希望它会有所帮助。

我的注册表。Java语言

@Component
public class MyRegistry {

   private Map<String, Object> resource = new HashMap<>();

    public MyRegistry() {
        this.resource.put("handler", new MyHandler());
    }

    public Map<String, Object> getResource() {
        return resource;
    }
}

MyHandler。Java语言

public class MyHandler {

    private String message;

    public MyHandler() {
        this.message = "Hello world";
    }
}

TestBean。Java语言

@Autowired
private MyRegistry myRegistry;

@Override
public void test() throws Exception {
   MyHandler handler = new ObjectMapper().convertValue(myRegistry.getResource().get("handler"), MyHandler.class);
    System.out.printf("message "+ handler.getMessage());
}
朱阳曜
2023-03-14

那么下面的代码(snippet1)有效吗?

Object mHandler1Obj = myRegistry.getResourcesMap().get("handler1", MyHandler1.class);

但是当你试图(片段2):

MyHandler1 handler1 = new ObjectMapper().convertValue(myHandler1Obj);

如果是这样,那么spring boot在这里就无关紧要了,“snippet1”工作的事实已经表明spring boot已经完成了它的工作。

现在,它的objectmapper无法将通用对象转换为MyHandler1。。。

为了重现它,尝试从等式中“排除”Spring靴,并仅检查片段2

顺便说一句,这可以解释为什么应用程序上下文(spring boot应用程序)毫无例外地启动:如果它不能自动连接某些东西,它将在启动过程中失败,但正如您所解释的那样,情况并非如此。。。

 类似资料:
  • 问题的核心是,我不能刷新或更改一个场景的节点的内容(这里是TablesMain)从另一个类(这里是NamePriceCell)。 我正在使用主StackPane(TableMainController扩展StackPane)构建和应用程序,其中包含其他节点,其中一些节点是ListView。在一个特定的ListView(比如“readitemslistview”)中,我创建了一个自定义ListCel

  • 本文向大家介绍Nginx自定义访问日志的配置方式,包括了Nginx自定义访问日志的配置方式的使用技巧和注意事项,需要的朋友参考一下 前言 Nginx日志主要分为两种:访问日志和错误日志。日志开关在Nginx配置文件(/etc/nginx/nginx.conf)中设置,两种日志都可以选择性关闭,默认都是打开的。 访问日志主要记录客户端访问Nginx的每一个请求,格式可以自定义。通过访问日志,你可以得

  • https://login.microsoftonline.com/geomobilestage.onmicrosoft.com/v2.0/。知名/openid-配置?p=b2c_1_login_signin 但URL返回404错误。但当我尝试以下URL读取配置时,我收到http状态200 https://geomobilestage.b2clogin.com/geomobilestage.onm

  • 目前正在开发web应用程序(Spring)。尝试为应用程序设置引导测试表,并将各种主题应用于该表。然而,似乎无法定位引导。我不知道这是一个简单的“我输入了错误的路径”问题,还是一个更大的设置问题。 我的文件布局目前如下: 我尝试了完全限定的名称,只是从资产部分,交换'/'s输入和输出,没有运气。我查看了引导留档,但如果您不使用CDN链接,则没有多少,这是我不能的。 和 除其他外,该表仍然看起来没有

  • 我已经创建了一个AEMServlet。现在我已经用servlet本身创建了OSGi配置(如下所示的数组类型的MULTI_字段),因为它也被定义为服务。现在,我的需求是如何在doGet方法中访问这个osgi配置。下面是servlet的代码。

  • 我正在工作的一个项目在我的业余时间,在这个项目我已被要求与Spring靴工作。我以前对Spring Boot并不熟悉,我试着在stackoverflow和Google上搜索这里,但我似乎无法理解针对我的问题的不同解决方案是如何工作的。 首先,这是我的错误信息: com.project.example.controller.VerverController中的构造函数参数0需要类型为“com.pro