org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homeurl' def

晚上在整合的SSH的时候爆了下面的错误,花了一个晚上也没有解决。

结果第二天把错误粘贴到一个文本中才看清楚错误的全貌,原来是 一个 action bean 的返回services引用名称搞错了。

没看完错误的详细信息,就去 网上 大片 google,结果白浪费了一个晚上,真是 太蛋疼了。





  1. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homeurl' defined in ServletContext resource [/WEB-INF/classes/applicationContext.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
  2. PropertyAccessException 1: org.springframework.beans.TypeMismatchException: Failed to convert property value of type [$Proxy1] to required type [com.blog.Services.IPassageService] for property 'passageService'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy1] to required type [com.blog.Services.IPassageService] for property 'passageService': no matching editors or conversion strategy found
  3. Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessException details (1) are:
  4. PropertyAccessException 1:
  5. org.springframework.beans.TypeMismatchException: Failed to convert property value of type [$Proxy1] to required type [com.blog.Services.IPassageService] for property 'passageService'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy1] to required type [com.blog.Services.IPassageService] for property 'passageService': no matching editors or conversion strategy found
  6. Caused by: java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy1] to required type [com.blog.Services.IPassageService] for property 'passageService': no matching editors or conversion strategy found
  7. at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:231)
  8. at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:138)
  9. at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:815)
  10. at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:645)
  11. at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:78)
  12. at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:59)
  13. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1122)
  14. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:857)
  15. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:423)
  16. at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:249)
  17. at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:155)
  18. at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:246)
  19. at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
  20. at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:291)
  21. at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352)
  22. at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:245)
  23. at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:188)
  24. at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49)
  25. at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4206)
  26. at org.apache.catalina.core.StandardContext.start(StandardContext.java:4705)
  27. at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
  28. at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
  29. at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)
  30. at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1079)
  31. at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1002)
  32. at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:506)
  33. at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1317)
  34. at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)
  35. at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
  36. at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1065)
  37. at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
  38. at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)
  39. at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
  40. at org.apache.catalina.core.StandardService.start(StandardService.java:525)
  41. at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
  42. at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
  43. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  44. at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  45. at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  46. at java.lang.reflect.Method.invoke(Unknown Source)
  47. at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
  48. at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Error starting Tomcat context. Exception: org.springframework.beans.factory.BeanCreationException. Message: Error creating bean with name 'servletEndpointRegistrar' defined in class path resource [org/springframework/boot/actuate/autoconfigure/endpoint/web/ServletEndpointManagementContextConfiguration$WebMvcServletEndpointManagementContextConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.actuate.endpoint.web.ServletEndpointRegistrar]: Factory method 'servletEndpointRegistrar' threw exception; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'healthEndpoint' defined in class path resource [org/springframework/boot/actuate/autoconfigure/health/HealthEndpointConfiguration.class]: Unsatisfied dependency expressed through method 'healthEndpoint' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'healthContributorRegistry' defined in class path resource [org/springframework/boot/actuate/autoconfigure/health/HealthEndpointConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.actuate.health.HealthContributorRegistry]: Factory method 'healthContributorRegistry' threw exception; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthContributorAutoConfiguration': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration
最新发布
05-10
<think>嗯,用户遇到了Tomcat启动时的Spring Bean创建异常,具体是BeanCreationException,涉及servletEndpointRegistrar、healthEndpoint和dataSource。我需要根据用户提供的引用和常见的Spring Boot问题来思考解决方案。 首先,用户提到的引用[2]中有一个UnsatisfiedDependencyException,因为memoryMonitor依赖的asyncNotifyService中的dumpService无法创建,原因是数据源未设置。这说明数据源配置有问题。可能的原因包括数据源配置缺失、数据库连接信息错误,或者依赖未正确引入。 接下来,用户的问题中提到了dataSource,所以需要检查数据源配置。比如,是否在application.properties或application.yml中正确配置了spring.datasource.url、username、password等。另外,是否有相关的数据库驱动依赖,比如H2、MySQL或PostgreSQL的驱动。如果使用JPA,还需要检查是否配置了spring.jpa.hibernate.ddl-auto等属性。 然后,关于healthEndpoint和servletEndpointRegistrar的问题,这可能与Spring Boot Actuator的配置有关。Actuator的端点依赖某些Bean的存在,如果数据源配置错误,健康检查端点可能会无法创建,因为它会检查数据源的健康状态。需要确认是否启用了Actuator,并且相关端点是否配置正确。例如,在application.properties中设置management.endpoints.web.exposure.include=health,info等。 另外,引用[2]中的错误提到了DataSource未设置,所以可能需要检查是否有多个数据源配置导致冲突,或者@Primary注解未正确使用。如果项目中有多个数据源,需要明确指定主数据源,或者排除自动配置,手动配置数据源。 还要考虑依赖冲突的问题。检查pom.xml或build.gradle中是否有版本不兼容的依赖,特别是Spring Boot Starter、JDBC、Actuator等。使用mvn dependency:tree或gradle dependencies命令查看依赖树,排除冲突的依赖。 还有可能是数据库连接问题,比如数据库服务未启动,或者网络问题导致连接超时。需要确认数据库是否可访问,端口是否正确,防火墙是否开放。 另外,查看日志中的详细堆栈跟踪,寻找更具体的错误信息。比如,是否有关JDBC Driver未找到,或者数据库表不存在等。根据日志中的具体错误信息进行排查。 用户提供的引用[4]提到了环境变量的问题,虽然和当前问题可能无关,但也需要检查是否环境变量设置正确,比如JAVA_HOME、PATH等,尤其是在不同的用户环境下,是否有权限问题导致配置文件未正确加载。 总结可能的解决步骤: 1. 检查数据源配置是否正确,包括URL、用户名、密码。 2. 确认数据库驱动依赖已正确添加。 3. 检查Actuator配置,确保端点正确暴露。 4. 排除依赖冲突,特别是数据源相关的库。 5. 检查是否有多个数据源配置,需要明确指定主数据源。 6. 查看完整错误日志,定位具体问题。 7. 测试数据库连接是否正常,确保数据库服务可用。 8. 确保Spring Boot版本与依赖库兼容。 可能用户没有正确配置数据源,或者依赖缺失,比如忘记添加spring-boot-starter-data-jpa或spring-boot-starter-jdbc。或者配置文件中使用了错误的数据库URL格式。另外,如果使用嵌入式数据库如H2,可能需要配置内存数据库的URL。 此外,Bean的创建顺序可能导致问题,比如某些Bean在数据源初始化之前被加载。可以使用@DependsOn注解来指定依赖顺序,但更常见的是通过正确配置数据源和自动配置来解决。 最后,建议用户提供更详细的错误日志,特别是异常堆栈的最底层原因,以便更准确地定位问题。例如,是否是数据库连接被拒绝,还是表不存在,或者是权限问题等。</think>### Tomcat启动时Spring Bean创建异常的解决方案 #### 一、问题分析 出现`BeanCreationException`通常与Bean的依赖注入或初始化过程有关。结合报错信息中的`servletEndpointRegistrar`、`healthEndpoint`和`dataSource`,核心问题可能集中在以下两方面: 1. **数据源(DataSource)配置异常**:Spring Boot Actuator的健康检查端点依赖数据源配置,若数据源未正确初始化,会导致`healthEndpoint`和依赖它的Bean(如监控组件)创建失败[^2]。 2. **依赖冲突或缺失**:Actuator组件(如`servletEndpointRegistrar`)可能因依赖库版本不兼容或配置缺失导致初始化失败。 --- #### 二、分步解决方案 ##### 1. 检查数据源配置 * **基础配置验证** 在`application.properties`或`application.yml`中确认数据源参数: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/db_name?useSSL=false spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` * **依赖库检查** 确保项目中包含数据库驱动依赖(如MySQL): ```xml <!-- Maven示例 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> ``` * **多数据源场景处理** 若存在多个数据源,需通过`@Primary`指定主数据源: ```java @Bean @Primary @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } ``` ##### 2. 排查Actuator组件问题 * **端点暴露配置** 在配置文件中启用健康检查端点: ```properties management.endpoints.web.exposure.include=health,info management.endpoint.health.enabled=true ``` * **依赖冲突解决** 检查是否因版本冲突导致`servletEndpointRegistrar`初始化失败: ```bash mvn dependency:tree | findstr "spring-boot-actuator" ``` 确保Spring Boot版本与Actuator兼容(如Spring Boot 2.7.x对应Actuator 2.7.x)。 ##### 3. 日志分析与调试 * **查看完整堆栈信息** 在日志中搜索`Caused by:`后的根本原因,例如: ``` Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure ``` 此类错误表明数据库连接失败,需检查数据库服务状态或网络权限。 * **启用调试模式** 在`application.properties`中添加: ```properties debug=true logging.level.org.springframework=DEBUG ``` ##### 4. 数据库连接测试 通过独立脚本验证数据库连通性: ```java public class DbConnectionTest { public static void main(String[] args) { try (Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/db_name", "root", "123456")) { System.out.println("连接成功"); } catch (SQLException e) { e.printStackTrace(); } } } ``` --- #### 三、进阶排查 1. **Bean初始化顺序控制** 使用`@DependsOn`强制指定Bean加载顺序: ```java @Bean @DependsOn("dataSource") public MemoryMonitor memoryMonitor() { return new MemoryMonitor(); } ``` 2. **排除自动配置冲突** 在启动类中添加排除项: ```java @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class }) ``` --- #### 四、典型错误案例参考 1. **嵌入式数据库未配置** 若使用H2数据库但未配置URL,需补充: ```properties spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.driverClassName=org.h2.Driver ``` 2. **JDBC驱动类名错误** MySQL 8.x驱动类应为`com.mysql.cj.jdbc.Driver`,而非旧版的`com.mysql.jdbc.Driver`[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值