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

外部jar中的Spring依赖注入

汪迪
2023-03-14

我有一个正在使用jar的项目a,比如B.jar(其中B是在项目a中用作依赖项的另一个项目),现在有一个bean(类似于spring-gemfire缓存),它在映射中保存所需的所有数据。这个映射bean被project(在我的项目中作为jar包含)使用,即B来读取缓存属性,但我无法这样做,有什么帮助吗?

项目B的webapp-config.xml

    <!-- Injecting bean in our A application -->
    <bean id="foo" class="com.abc.solutions.Foo" init-method="loadFoo">
             <property name="bar1" ref="gemFireBean"/>
             <property name="bar2" ref="commonBean"/>
    </bean>

    <bean id="b2" class="java.util.HashMap"
       factory-bean="foo" factory-method="createB2" autowire="byName">
    </bean>

上面的bean b2必须在外部项目B中使用(作为jar包含在我的项目A中)。

@Autowired
    @Qualifier("b2")
    private Map<String, String> mapFromA;

但我得到了

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] found for dependency

任何帮助都将不胜感激。

共有1个答案

郭博涉
2023-03-14

简短回答:hashmap(或任何其他泛型容器,如数组或集合)永远不应该是Spring bean。只有业务对象应该是bean,而不是基础结构容器。

您可以通过在地图周围构建一个自定义对象并注入该对象来规避此问题。在您的示例中,应该注入foobean,并以编程方式从中获取映射。

手册的@autowired部分概述了您的情况:

public class MovieRecommender {

    private Map<String, MovieCatalog> movieCatalogs;

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

    // ...

}
 类似资料:
  • 我们在产品中使用Spring引导微服务,我们有多达10个应用程序。为了记录,我们使用Log4j MDC来生成事务标识,并使用拦截器和过滤器将其传递给服务[超文本传输协议标头]。问题是我们必须在我们所有的应用程序(比如10个)中添加拦截器和过滤器来跟踪这个事务。有没有办法在我们的微服务应用程序中创建jar并注入。 我们能否在所有应用程序中使用最少的代码更改来实现这一点?

  • 我尝试过在IntelliJ的project structure下通过库添加JAR,并只在根目录下的libs文件夹中添加JAR。首先,我提供了绝对路径,但后来我将其更改为${basedir},因为绝对路径没有映射为docker容器上的卷。有什么方法可以将外部jar与项目jar打包,以便在docker容器中使用它?

  • 我需要在我的maven项目中添加大约15个罐子,它在远程和中央存储库中都不可用。 然而,我实现了以下目标:, > 在我的项目路径中添加了jars(\src\lib) 将pom更改如下, 我的问题是: 我是否需要像上面那样分别对所有15个JAR重复它,或者我们有任何其他方法来绑定这些JAR并将其作为一个依赖路径? Maven在这里讨论了同样的事情:指向多个JAR的系统依赖性。但我想知道我是否能得到更

  • 我熟悉使用make构建大型应用程序,但现在我已经开始使用Android Studio,我想了解如何在Makefile中完成我已经做过的事情。 下面是一个可能有助于您确定答案的示例: Makefile示例:(极简主义) 更简单的例子: 在Gradle怎么做? 我想解决上面示例中提到的外部依赖关系。实际上,我是通过“make”来实现的,但我想完全删除这个额外的步骤。

  • 我正在编写一个应用程序,该应用程序与一个数据库通信,获取其他数据库的凭据,并连接到其他数据库。它使用在运行时构造的数据源和实体管理器工厂来执行此操作。 如果我想使用Spring Data Repositories,我想我需要自动连接它们,因此它们必须是Spring Beans。 如果在对第一个数据库运行查询之前没有构造的DataSource,我如何使用Spring Data?

  • 谢谢你。 更新:我找到了另一个解决方案,并在另一个帖子中发布了答案:https://stackoverflow.com/a/52021965/2580829