我将一些SQL查询以Map的形式存储在应用程序上下文.xml文件中

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

<util:map id="queries" key-type="java.lang.String" value-type="java.lang.String">
    <description>Map contain SQL queries to handle ETL Framework database operations</description>
    <entry key="getJobById" value="SELECT * FROM etl_jobs WHERE job_id = ?"/>
    <entry key="getJobsByName" value="SELECT * FROM etl_jobs WHERE job_name LIKE ?"/>
    ...
</util:map>    
In my Java code I have the following:
@Repository
@ImportResource("classpath:applicationContext.xml")
public class EtlDataRepository {

    private static final Logger LOG = LoggerFactory.getLogger(EtlDataRepository.class.getName());

    @Autowired
    private JdbcTemplate jdbc;

    private Map<String, String> queries;
    ...
}

我也有这个类的setter和getter. 但是,当应用程序启动时,查询bean不会加载,即它为null. 几年前我写了非常相似的代码,它工作得很好. Spring-boot从v.2.3到v.3.2有什么变化使它无法工作,我该如何修复它?

将@ImportResource移到顶部,即@SpringBootApplication没有改变任何事情.将@AuTower添加到 map 查询导致以下错误:

*


描述:

Com.visa.vms.etl.daemon.dao.EtlDataRepository中的字段查询 找不到所需的‘java.util.Map’类型的Bean.

注入点具有以下注释:

  • @org.springframework.beans.factory.annotation.Autowired(required=true)

该Bean在ApplationConext.xml文件中定义.看起来这个上下文没有被导入.

在使用SpringBootv.2.3的旧应用程序中使用了完全相同的代码(具有不同的 map 内容),并且无需自动装配即可工作.

推荐答案

有了@Qualifier("queries"),我就能够"连接"所描述的(XML+)映射……如下所示:

package com.example.demo;

import java.util.Map;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ImportResource;

@SpringBootApplication
@ImportResource("classpath:applicationContext.xml")
public class Demo {
    public static void main(String[] args) {
        SpringApplication.run(Demo.class, args);
    }

    @Bean
    InitializingBean hello(/*@Autowired*/ @Qualifier("queries") Map<String, String> queries) {
        return () -> System.err.println(queries);
    }
}

...没有强有力的论据,为什么它不应该在任何Bean/存储库/服务中工作.

不过,我不能这么快地重现这个错误:省略限定符至少会填充(以某种方式在默认的快速入门中)empty map .


要重现"失败的应用程序启动",我们可以使用:

@Bean
InitializingBean hello2(Map x) {
  return () -> System.err.println(x);
}

,其中或:

  • (参数)名称符合条件
  • (Nor)声明的泛型类型参数.

它为我们提供了(在弹簧靴快速启动中):

...
***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method hello2 in com.example.demo.Demo required a single bean, but 5 were found:
        - queries: defined in unknown location
        - systemProperties: a programmatically registered singleton
        - systemEnvironment: a programmatically registered singleton
        - contextParameters: a programmatically registered singleton
        - contextAttributes: a programmatically registered singleton

@Value替代方案

这也是可能的:

//..somewhere in a spring bean (aware of applicationContext.xml)...
@Value("#{queries}") Map<String, String> queries;

...一个(org.springframework...)@Value + SpEL的"'查询' bean"+匹配字段/参数.

Java相关问答推荐

编译期间错误(Java 0000)Android .Net MAUI

Jooq外键关系

错误:在Liferay7.4中找不到符号导入com.liferay.portal.kernel.uuid.PortalUUID;";

所有 case 一起输入时输出错误,而单独放置时输出正确

在Java Swing Paint应用程序中捕获快速鼠标移动时遇到困难

将关键字与正文中的_Allowed匹配,但带有__Signing可选后缀

我无法获取我的Java Spring应用程序的Logback跟踪日志(log)输出

在springboot 3中,当我调用api endpoint时,会出现404

当涉及到泛型时,类型推理在Java中是如何工作的?

Java中的死锁及其重入锁和锁

使用Spring和ActiveMQ的侦听器方法引发属性名称不能重复为空警告

测试容器无法加载类路径初始化脚本

把一条整型短裤和两条短裤装成一条长的

Sack()步骤中的合并运算符未按预期工作

使IntelliJ在导入时优先 Select 一个类或将另一个标记为错误

未调用OnBackPressedCallback-Activitiy立即终止

在权限列表中找不到我的应用程序

如何使用我的RLE程序解决此问题

在JPanel上使用GridBagLayout并将JButton放在里面时出现问题

有没有办法仅将 JComboBox 中的选定项目居中(因此保持组合框中的所有项目左对齐)