Báo cáo Đánh giá Điều kiện Tự động Cấu hình trong Spring Boot

Phần đầu tiên xuất hiện khi khởi động ứng dụng Spring Boot — với tiêu đề CONDITIONS EVALUATION REPORT — không phải là lỗi. Đây là bản báo cáo chi tiết về quá trình kiểm tra các điều kiện (conditions) để kích hoạt hoặc bỏ qua các cấu hình tự động (auto-configuration) trong môi trường hiện tại.

Đây là cơ chế kiểm tra điều kiện, không phải ngoại lệ

Khi bật chế độ debug (ví dụ: thêm --debug hoặc thiết lập logging.level.org.springframework.boot.autoconfigure=DEBUG), Spring Boot sẽ in ra toàn bộ danh sách các cấu hình đã được áp dụng (Positive matches) và bỏ qua (Negative matches). Mỗi mục đều kèm theo lý do dựa trên các annotation như @ConditionalOnClass, @ConditionalOnMissingBean, @ConditionalOnProperty, v.v.

Ví dụ một số dòng tiêu biểu:

RestTemplateAutoConfiguration matched:
   - @ConditionalOnClass found required class 'org.springframework.web.client.RestTemplate'
   - NotReactiveWebApplicationCondition confirmed non-reactive web environment

ServletWebServerFactoryAutoConfiguration.TomcatConfiguration matched:
   - @ConditionalOnClass found 'org.apache.catalina.startup.Tomcat'

WebMvcAutoConfiguration#formContentFilter matched:
   - @ConditionalOnBooleanProperty (spring.mvc.formcontent.filter.enabled=true)
   - @ConditionalOnMissingBean (types: org.springframework.web.filter.FormContentFilter)

Các dòng này cho biết Spring Boot đã phát hiện lớp RestTemplate, thư viện Tomcat tồn tại trong classpath, và tính năng form content filter được bật — nên cấu hình tương ứng được áp dụng.

Lỗi thực sự nằm ở phần Caused by

Trong cùng log, phần cuối mới chứa thông tin lỗi nghiêm trọng — thường bắt đầu bằng Caused by:. Trong trường hợp này:

Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: 
Invalid bean definition with name 'tigerMapper' [...] 
Invalid value type for attribute 'factoryBeanObjectType': java.lang.String

Lỗi này xảy ra trong giai đoạn khởi tạo ngữ cảnh Spring, cụ thể khi xử lý bean tigerMapper — một mapper MyBatis Plus. Nguyên nhân gốc rễ là sự **không tương thích giữa phiên bản Spring Boot và MyBatis Plus**:

  • Spring Boot 3.5+ (dựa trên Spring Framework 6.2+) thắt chặt kiểm tra kiểu dữ liệu thuộc tính factoryBeanObjectType trong định nghĩa bean.
  • MyBatis Plus 3.5.x (đặc biệt với các phiên bản cũ hơn) có thể trả về giá trị kiểu String cho thuộc tính này — vi phạm quy ước mới.

Giải pháp phổ biến là đồng bộ hóa phiên bản:

  • Tùy chọn 1 (khuyến nghị): Nâng cấp MyBatis Plus lên phiên bản hỗ trợ Spring Boot 3.5+, ví dụ 4.3.0+ — đảm bảo tương thích đầy đủ với Spring Framework 6.2.
  • Tùy chọn 2: Nếu không thể nâng cấp MyBatis Plus, hãy hạ xuống Spring Boot 3.2.x hoặc 3.3.x — những phiên bản vẫn duy trì mức độ linh hoạt cao hơn với các thư viện cũ.

Không nên nhầm lẫn phần báo cáo điều kiện (có ích cho việc gỡ lỗi cấu hình) với lỗi khởi tạo bean — hai khái niệm hoàn toàn khác biệt về bản chất và thời điểm xảy ra.

Thẻ: spring-boot MyBatis-Plus auto-configuration bean-definition conditional-logic

Đăng vào ngày 21 tháng 7 lúc 07:55