Skip to content

启动失败:platformConfigServiceuserService 双向注入导致 BeanCurrentlyInCreationException #150

Description

@Royikiss

环境信息

  • 系统:Arch Linux
  • Java:OpenJDK 8(容器内)
  • Maven:3.9.12
  • Docker & Compose:最新版
  • 项目版本:jshERP-boot(日志显示 ErpApplication v3.6-SNAPSHOT
  • Spring Boot:2.0.0.RELEASE

复现流程

1. 源码编译

cd /mnt/GreatWall/Projects/jshERP
mvn clean package -DskipTests

2. Dockerfile

FROM eclipse-temurin:8-jre
WORKDIR /app
ARG JAR_FILE=jshERP-boot/target/*.jar
COPY ${JAR_FILE} app.jar
EXPOSE 9999
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app/app.jar"]

3. docker-compose.yml

services:
  mysql:
    image: mysql:8.0.24
    environment:
      MYSQL_ROOT_PASSWORD: "Root@123456"
      MYSQL_DATABASE: "jsh_erp"
    ports:
      - "3306:3306"
    volumes:
      - ./docker/mysql/data:/var/lib/mysql
      - ./docker/mysql/init:/docker-entrypoint-initdb.d
    healthcheck:
      test: ["CMD-SHELL", "mysqladmin ping -h localhost -pRoot@123456"]
      interval: 10s
      timeout: 5s
      retries: 20

  redis:
    image: redis:5
    command: ["redis-server", "--requirepass", "123456"]
    ports:
      - "6379:6379"

  app:
    build:
      context: .
      dockerfile: Dockerfile
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_started
    environment:
      JAVA_OPTS: "-Dspring.main.allow-circular-references=true -Xms256m -Xmx1024m"
      SPRING_DATASOURCE_URL: "jdbc:mysql://mysql:3306/jsh_erp?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true"
      SPRING_DATASOURCE_USERNAME: "root"
      SPRING_DATASOURCE_PASSWORD: "Root@123456"
      SPRING_REDIS_HOST: "redis"
      SPRING_REDIS_PORT: "6379"
      SPRING_REDIS_PASSWORD: "123456"
      SPRING_PROFILES_ACTIVE: "prod"
    ports:
      - "9999:9999"
    volumes:
      - ./logs:/app/logs

4. .dockerignore

docker/mysql/data
docker/mysql/data/**
.git
.gitignore
node_modules

5. 完整启动脚本(full-workflow.sh)

#!/bin/bash
set -e
cd /mnt/GreatWall/Projects/jshERP

# 1) 清理旧数据(MySQL 5.7 → 8.0 需删旧数据目录)
sudo rm -rf docker/mysql/data

# 2) 编译 jar(容器内 JDK8 编译)
docker run --rm \
  -v "$(pwd)":/build \
  -w /build \
  maven:3.8.6-openjdk-8 \
  mvn clean package -DskipTests

# 3) 构建并启动所有服务
docker compose down
docker compose up -d --build

# 4) 查看状态
docker compose ps

# 5) 查看 app 日志(等待 "Tomcat started on port(s): 9999")
docker compose logs -f app

实际结果

编译功能正常(jar 正常产出),但运行时 Spring 启动失败,容器反复 Restarting (1)

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException:
Error creating bean with name 'platformConfigService':
Bean with name 'platformConfigService' has been injected into other beans [userService]
in its raw version as part of a circular reference, but has eventually been wrapped.
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'systemConfigController': Injection of resource dependencies failed;
nested exception is ... BeanCurrentlyInCreationException ...

端口 localhost:9999 无法访问(ERR_CONNECTION_REFUSED)。


根因定位

源码级双向注入(循环依赖):

UserService.java → 注入 PlatformConfigService

@Resource
private PlatformConfigService platformConfigService;

PlatformConfigService.java → 又注入回 UserService

@Resource
private UserService userService;

SystemConfigService 同时依赖这两者,触发初始化链冲突。
注意:spring.main.allow-circular-references=true 在 Spring Boot 2.0.0.RELEASE 下不生效(该参数是 2.6+ 引入)。


期望结果

应用正常启动,日志出现 Tomcat started on port(s): 9999,后端可访问。

我个人是个java菜鸟,说实话每咋有时间去调试java代码,希望后来人可以试试看,这个代码的问题应该不是容器造成的,本地跑应该也会有,也就是说我怀疑目前的源码有问题?(很大胆的怀疑

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions