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

Spring Boot注释配置的时间问题

魏硕
2023-03-14

我们在spring boot应用程序中对bean、存储库和控制器的计时有一个奇怪的问题。

我们有一个有地图支持的NodeRepository。这个Map对象应该是我们使用@Bean注释创建的一个Map,但Spring似乎正在创建自己的Map,并将其注入到我们的NodeRepository中。这是一个问题,因为Spring假设了我们的键值,所以地图中的键是错误的。

以下是所有需要的代码

组织。xxx。应用

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {

        return application.sources(Application.class);
    }

    @Bean
    public Map<String, RemoteNode> getRemoteNodeMap() {

        HashMap<String, RemoteNode> remoteNodeMap = new HashMap<>();
        remoteNodeMap.put("NODE1", this.getRemoteNode1());
        remoteNodeMap.put("NODE2", this.getRemoteNode2());

        return remoteNodeMap;
    }

    @Bean(name = "remoteNode1")
    public RemoteNode getRemoteNode1() {

        return new DefaultRemoteNode("NODE1");
    }

    @Bean(name = "remoteNode2")
    public RemoteNode getRemoteNode2() {

        return new DefaultRemoteNode("NODE2");
    }
}

组织。xxx。存储库。远程节点存储

@Repository
public class RemoteNodeRepositoryImpl implements RemoteNodeRepository {

    private Map<String, RemoteNode> remoteNodeMap;

    @Autowired
    public RemoteNodeRepository(Map<String, RemoteNode> remoteNodeMap) {
        this.remoteNodeMap = remoteNodeMap;
    }
}

我希望注入RemoteNodeRepository的是一个如下所示的映射:

“节点1”,远程节点(“节点1”)

“节点2”,远程节点(“节点2”)

然而,这是正在注入到远程节点存储库中的Map:

“remoteNode1”,RemoteNode(“NODE1”)

“remoteNode2”,RemoteNode(“NODE2”)

注意,键的名称基于应用程序类中@Bean注释的名称。如果我们删除@Bean的“name”限定符,键将以方法命名。

如果我们将@Qualifier注释添加到RemoteNodeRepository的Map属性,我们会得到以下异常:

原因:org。springframework。豆。工厂NoSuchBeanDefinitionException:找不到符合依赖项[map with value type org.chronopolis.remote.node.RemoteNode]类型[org.chronopolis]的符合条件的bean(映射的值类型为org.chronopolis.remote.node.RemoteNode)]:至少需要1个符合此依赖项autowire候选条件的bean。依赖项注释:{@org.springframework.beans.factory.annotation.Qualifier(value=remoteNodeMap)}

最后,在调试器中设置断点时,我们可以清楚地看到RemoteNodeRepository是在应用程序类中的getRemoteNodeMap()方法调用之前实例化的。

我们能做些什么来解决这个时间问题?我很困惑。

共有1个答案

桑璞
2023-03-14

我认为这不是时间问题。您与spring的这一特性(来自http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/)

即使键入的映射也可以自动连接,只要所需的键类型是字符串。映射值将包含预期类型的所有bean,键将包含相应的bean名称:

@Autowired
public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) {
    this.movieCatalogs = movieCatalogs;
}

老实说,我不确定您是否可以轻松地“重写”这个,不管简单的解决方法应该如何——只需使用一些包装器类使您的类型变得特殊——比如(伪代码):

class NodeMap {
   Map<String, RemoteNode> map;
}

然后在你的@Bean定义和自动连线时使用它。或者干脆不要创建映射并使用spring特性(或者重命名节点bean)。

 类似资料:
  • 问题内容: 在最近我从事的一些大型项目中,选择其中一种(XML或注释)似乎变得越来越重要。随着项目的发展,一致性对于可维护性非常重要。 我的问题是:与基于注释的配置相比,基于XML的配置有哪些优势?与基于XML的配置相比,基于注释的配置有哪些优势? 问题答案: 注释有其用途,但它们不是杀死XML配置的灵丹妙药。我建议将两者混合! 例如,如果使用Spring,则将XML用于应用程序的依赖注入部分是完

  • 问题内容: 我正在尝试将Hibernate 4仅用于注释和一个文件。我做了自己的注释,并使用反射将其添加到配置中。我可以用这种方式很好地使用Hibernate 4,但是我的配置是使用不推荐使用的方法构建的。 (不建议使用的代码:)。 甚至hibernate 4文档也显示以这种方式构建配置。 如果我尝试使用新方法(,则不会得到相同的结果,并且似乎很多不必要的代码可以完全执行不推荐使用的方法。但是,我

  • 我试图创建一个简单的spring mvc应用程序进行实践,但我不断地得到这样的错误: 在名为'MVC-Dispatcher'的DispatcherServlet中没有找到带有URI的HTTP请求映射,我从Tomcat得到了404错误。 这是我的控制器 当在dispatcher servlet中使用bean时,我可以让控制器工作,但出于某种原因,我无法获得带有注释的正确处理程序映射。我是不是猜我的m

  • 问题内容: 我有一个简单的问题。我已经看到了两种方式的示例。问题是-“为什么不能在字段上放置注释?”。让我举一个例子.... 上面的代码很好用(假设那里没有错字)。当将注释放在属性的getter上时,一切就完美了。 但是,这对我来说似乎很尴尬。在我看来,将注解放在字段上比较干净,就像这样- 我已经看到了两种方式的示例。但是,当我运行第二个示例时,我得到以下信息… 这是(标有第25行)… 的骨架。

  • 问题内容: 我有一个简单的问题。我已经看过两种方式的例子。问题是-“为什么不能在字段上放置注释?”。让我举一个例子.... 上面的代码可以正常工作(假设那里没有错字)。当将注释放在属性的getter上时,一切就完美了。 但是,这对我来说似乎很尴尬。在我看来,将注解放在字段上比较干净,就像这样- 我已经看到了两种方式的示例。但是,当我运行第二个示例时,我得到以下信息… 这是(标有第25行)… 的骨架

  • 我已经制作了几个应用程序,它们使用了纯注释Spring配置。现在,我想试着建一个图书馆。 < li >库应该使用纯注释Spring配置。 < li >使用该库的项目应该能够在没有任何特殊Spring配置的情况下使用该库。事实上,我希望这个库可以与Spring和非Spring项目互换使用。所有的Spring配置都应该在库jar中处理。 < li >该库应该可用于非web应用程序的项目。 < li >