Spring boot 2.1.3从2.0.6更新导致util:map的BeanDefinitionParsingException

Spring boot 2.1.3从2.0.6更新导致util:map的BeanDefinitionParsingException,spring,spring-boot,Spring,Spring Boot,我在应用程序上下文xml中使用了下面的映射bean定义,并在控制器中使用了映射,这导致BeanDefinitionParsingException用于spring boot 2.1.3升级。它在2.0.6版本中运行良好 有人知道如何解决这个问题吗 在应用程序属性中定义“spring.main.allow bean definition overriding=true”并不能解决此问题 @SpringBootApplication @PropertySource("classpath:app.pr

我在应用程序上下文xml中使用了下面的映射bean定义,并在控制器中使用了映射,这导致
BeanDefinitionParsingException
用于spring boot 2.1.3升级。它在2.0.6版本中运行良好

有人知道如何解决这个问题吗

在应用程序属性中定义“
spring.main.allow bean definition overriding=true
”并不能解决此问题

@SpringBootApplication
@PropertySource("classpath:app.properties")
public class Application extends SpringBootServletInitializer {


    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    public static void main(String[] args) throws Exception {// NOSONAR
        SpringApplication.run(Application.class, args);
    }

}

@Configuration
public class ApplicationConfig {

    @Configuration
    @ImportResource("classpath*:applicationContext.xml")    
    public static class XmlImportingConfiguration {
    }

}

app.properties
#Spring Boot
server.contextPath=/myapp
server.servlet.context-path=/myapp
spring.application.name=myapp
server.tomcat.max-threads=200
server.port=901
server.error.whitelabel.enabled=false

logging.level.org.springframework.web: INFO
logging.level.org.springframework: INFO
logging.level.com.wellsfargo: INFO
server.tomcat.accessLogEnabled=false
logging.config=config/log4j2.xml

spring.view.prefix: /WEB-INF/jsp/
spring.view.suffix: .jsp

applicationContext.xml 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:task="http://www.springframework.org/schema/task" xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd
       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

        <util:map id="lookup">
            <entry key="60" value="1 hour"></entry>
            <entry key="480" value="8 hours"></entry>
            <entry key="1440" value="24 hours"></entry>
            <entry key="2880" value="2 days"></entry>
        </util:map>
</beans>

@Controller
@RequestMapping("/")
public class MyController{
    @Resource(name="lookup")
    private Map<String,String> lookup;

}
@springboot应用程序
@PropertySource(“类路径:app.properties”)
公共类应用程序扩展了SpringBootServletInitializer{
@凌驾
受保护的SpringApplicationBuilder配置(SpringApplicationBuilder应用程序){
返回应用程序.sources(application.class);
}
公共静态void main(字符串[]args)引发异常{//NOSONAR
SpringApplication.run(Application.class,args);
}
}
@配置
公共类应用程序配置{
@配置
@ImportResource(“类路径*:applicationContext.xml”)
公共静态类XmlImportingConfiguration{
}
}
app.properties
#弹簧靴
server.contextPath=/myapp
server.servlet.context path=/myapp
spring.application.name=myapp
server.tomcat.max线程数=200
server.port=901
server.error.whitelabel.enabled=false
logging.level.org.springframework.web:INFO
logging.level.org.springframework:INFO
logging.level.com.wellsfargo:INFO
server.tomcat.accessLogEnabled=false
logging.config=config/log4j2.xml
spring.view.prefix:/WEB-INF/jsp/
spring.view.suffix:.jsp
applicationContext.xml
@控制器
@请求映射(“/”)
公共类MyController{
@资源(name=“lookup”)
私有地图查找;
}
错误:

org.springframework.beans.factory.parsing.Bean定义ParsingException: 配置问题:名为“lookup”的bean定义无效 在null中定义:无法注册bean定义[泛型bean:类] [org.springframework.beans.factory.config.MapFactoryBean];范围=; abstract=false;lazyInit=false;autowireMode=0;dependencyCheck=0; autowireCandidate=true;primary=false;factoryBeanName=null; factoryMethodName=null;initMethodName=null;destroyMethodName=null] 对于bean“lookup”:已经有[genericbean:class [org.springframework.beans.factory.config.MapFactoryBean];范围=; abstract=false;lazyInit=false;autowireMode=0;dependencyCheck=0; autowireCandidate=true;primary=false;factoryBeanName=null; factoryMethodName=null;initMethodName=null;destroyMethodName=null] 束缚


这可能不是您想要的,但为什么不用Java配置替换XML呢。您不应该启用bean重写,因为这会使调试SpringIOC启动问题变得非常困难

@Configuration
public class ApplicationConfig {

    @Bean
    public Map<String, String> lookup() {
      return Map.of(
            "60", "1 hour", 
            "480", "8 hour", 
            "1440", "24 hours", 
            "2880", "2 days"
      );
    }

}
@配置
公共类应用程序配置{
@豆子
公共地图查找(){
返回地图(
“60”,“1小时”,
“480”,“8小时”,
“1440”,“24小时”,
“2880”,“2天”
);
}
}

我有解决这个问题的方法。基本上将映射从applicationContext.xml移动到应用程序属性,并使用@Value进行检索,如下所示

app.properties
lookup={'60':'Last 1 hour','480':'Last 8 hours','1440':'Last 24 hours','2880':'Last 2 days'}

ApplicationProperties.java
    @Value("#{${lookup}}")
    private Map<String,String> lookupTimeinterval;
app.properties
查找={'60':'Last 1hour','480':'Last 8hours','1440':'Last 24hours','2880':'Last 2days'}
ApplicationProperties.java
@值(“#{${lookup}}”)
私有地图查找时间间隔;

如果您不想使用“application.properties”文件,也可以使用“yaml”文件

Yaml支持属性中的键值

应用程序.yaml

myVales:
  60: "1 hour" 
  480: "8 hour" 
  1440: "24 hours" 
  2880: "2 days"
MyConfig.class

@Configuration
@ConfigurationProperties
public class MyConfig {

    private Map<String, String> myValues;

    //getters

}
@配置
@配置属性
公共类MyConfig{
私有映射值;
//吸气剂
}

您在哪里定义了映射,它是否包含在配置中?它是在applicationContext.xml中定义的。您可以添加应用程序上下文xml吗?@skumar我添加了一个基本示例。我可以重新创建问题的唯一方法是使用两个名为“lookup”的bean,这让我觉得还有另一个隐藏在名称查找中的地方-注意bean定义与bean的名称相关,而不是它们的类型,所以如果有另一个称为“查找”在任何其他地方都可以定义error@skumar正如Darren指出的,在其他地方定义了另一个查找,手动清理构建文件夹,这可能是因为IDE问题,我不想硬编码代码中的常量。不管怎样,我已经想出了一个不同的解决方案。下面的一个例子是:SkUMAR,也许你的真实生活的例子更复杂,但是示例常量没有意义,它们可以用<代码>持续时间< /代码>类或简单算术来计算。