springbootAI 2.3.2__tar.gz → 2.3.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {springbootai-2.3.2 → springbootai-2.3.3}/CHANGELOG.md +36 -18
- {springbootai-2.3.2 → springbootai-2.3.3}/MANIFEST.in +2 -2
- {springbootai-2.3.2/springbootAI.egg-info → springbootai-2.3.3}/PKG-INFO +71 -71
- {springbootai-2.3.2 → springbootai-2.3.3}/README.md +65 -65
- {springbootai-2.3.2 → springbootai-2.3.3}/SECURITY.md +1 -1
- {springbootai-2.3.2 → springbootai-2.3.3}/pyproject.toml +57 -57
- {springbootai-2.3.2 → springbootai-2.3.3}/requirements-ai.txt +1 -1
- {springbootai-2.3.2 → springbootai-2.3.3}/requirements.txt +5 -0
- {springbootai-2.3.2 → springbootai-2.3.3/springbootAI.egg-info}/PKG-INFO +71 -71
- springbootai-2.3.3/springbootAI.egg-info/SOURCES.txt +339 -0
- springbootai-2.3.3/springbootAI.egg-info/entry_points.txt +3 -0
- {springbootai-2.3.2 → springbootai-2.3.3}/springbootAI.egg-info/requires.txt +5 -5
- springbootai-2.3.3/springbootAI.egg-info/top_level.txt +1 -0
- springbootai-2.3.3/springbootai/__init__.py +179 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/ai/__init__.py +13 -13
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/ai/advisors.py +3 -3
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/ai/annotations.py +3 -3
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/ai/autoconfig.py +23 -23
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/ai/core.py +2 -2
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/ai/memory.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/ai/observability.py +2 -2
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/ai/providers.py +6 -6
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/ai/resilience.py +11 -11
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/ai/vectorstore.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/annotations/__init__.py +10 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/annotations/cache.py +2 -2
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/annotations/cloud.py +2 -2
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/annotations/conditional.py +3 -3
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/annotations/core.py +38 -2
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/annotations/enterprise.py +6 -6
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/annotations/langchain.py +2 -2
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/annotations/langgraph.py +2 -2
- springbootai-2.3.3/springbootai/annotations/lombok.py +300 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/annotations/messaging.py +5 -5
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/annotations/security.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/aop/aspect.py +7 -6
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/aop/cloud_aop.py +5 -5
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/aop/comprehensive_aop.py +5 -5
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/aop/proxy_factory.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/batch/__init__.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/cli/__init__.py +4 -4
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/cli/main.py +5 -5
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/cli/scaffold.py +13 -13
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/cloud/__init__.py +20 -14
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/cloud/bus.py +3 -3
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/cloud/config_center.py +4 -4
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/cloud/feign.py +4 -4
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/cloud/gateway.py +3 -3
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/cloud/load_balancer.py +1 -1
- springbootai-2.3.3/springbootai/cloud/nacos_config.py +276 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/cloud/seata.py +3 -3
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/cloud/seata_at_proxy.py +2 -2
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/config/binding.py +5 -5
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/config/config_loader.py +145 -19
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/config/spring-configuration-metadata.json +5 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/context/application_context.py +27 -23
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/context/bean_definition.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/context/bean_factory.py +22 -22
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/context/scanner.py +1 -1
- springbootai-2.3.3/springbootai/core/__init__.py +3 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/csv/__init__.py +4 -4
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/csv/annotations.py +2 -2
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/csv/converters.py +4 -4
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/csv/exceptions.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/csv/reader.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/csv/writer.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/data/__init__.py +7 -7
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/data/repository.py +3 -3
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/data/rest.py +4 -4
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/datasource/__init__.py +3 -3
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/datasource/annotations.py +8 -3
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/event/__init__.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/event/publisher.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/excel/__init__.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/excel/annotations.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/i18n/__init__.py +4 -4
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/i18n/auto_config.py +4 -4
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/i18n/holder.py +2 -2
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langchain/__init__.py +21 -21
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langchain/adapters.py +335 -335
- springbootai-2.3.3/springbootai/langchain/agents/__init__.py +4 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langchain/agents/services.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langchain/annotations.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langchain/autoconfig.py +28 -28
- springbootai-2.3.3/springbootai/langchain/callbacks/__init__.py +4 -0
- springbootai-2.3.3/springbootai/langchain/chains/__init__.py +4 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langchain/chains/services.py +5 -5
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langchain/core.py +19 -19
- springbootai-2.3.3/springbootai/langchain/indexes/__init__.py +4 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langchain/indexes/index.py +2 -2
- springbootai-2.3.3/springbootai/langchain/loaders/__init__.py +4 -0
- springbootai-2.3.3/springbootai/langchain/memory/__init__.py +4 -0
- springbootai-2.3.3/springbootai/langchain/parsers/__init__.py +4 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langchain/parsers/parsers.py +84 -84
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langchain/partners.py +2 -2
- springbootai-2.3.3/springbootai/langchain/prompts/__init__.py +4 -0
- springbootai-2.3.3/springbootai/langchain/retrievers/__init__.py +4 -0
- springbootai-2.3.3/springbootai/langchain/tools/__init__.py +4 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langchain/tools/tools.py +1 -1
- springbootai-2.3.3/springbootai/langchain/utilities/__init__.py +4 -0
- springbootai-2.3.3/springbootai/langchain/vectorstores/__init__.py +4 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langchain/vectorstores/stores.py +4 -4
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langgraph/__init__.py +7 -7
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langgraph/annotation_runtime.py +5 -5
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langgraph/annotations.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langgraph/autoconfig.py +10 -10
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langgraph/checkpoint.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langgraph/config.py +3 -3
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langgraph/runtime.py +4 -4
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/logging/loguru_logger.py +134 -32
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/main.py +105 -50
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/mcp/__init__.py +6 -6
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/mcp/annotation_runtime.py +5 -5
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/mcp/annotations.py +5 -5
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/mcp/autoconfig.py +11 -11
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/mcp/client.py +3 -3
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/mcp/config.py +3 -3
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/mcp/server.py +4 -4
- springbootai-2.3.3/springbootai/monitoring/admin_client.py +77 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/__init__.py +22 -18
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/ddl_auto.py +33 -3
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/mybatis_integration.py +6 -6
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/__init__.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/mapper/mapper.py +11 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/version.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/retry/__init__.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/retry/recovery.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/retry/retry_decorator.py +2 -2
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/security/jwt_utils.py +31 -8
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/security/oauth2.py +2 -2
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/security/replay_protection.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/security/security_aop.py +2 -2
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/test/__init__.py +3 -3
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/test/slicing.py +9 -9
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/tx/__init__.py +2 -2
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/tx/events.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/utils/banner.py +4 -4
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/utils/logger.py +13 -28
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/validation/__init__.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/validation/aop.py +4 -4
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/validation/constraints.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/validation/validator.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/web/actuator.py +451 -66
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/web/csrf.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/web/exception_handler.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/web/hateoas.py +4 -4
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/web/health.py +7 -18
- springbootai-2.3.3/springbootai/web/request_metrics.py +283 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/web/swagger.py +5 -5
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/web/web_context.py +58 -17
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/websocket/__init__.py +2 -2
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/websocket/annotations.py +1 -1
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/websocket/handler.py +1 -1
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_actuator.py +11 -11
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_actuator_prometheus_admin.py +104 -2
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_ai_comprehensive.py +93 -93
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_ai_declarative_annotations.py +2 -2
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_ai_module.py +54 -54
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_annotation_combinations.py +4 -4
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_annotations_contract.py +12 -12
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_aop_annotations_full.py +2 -2
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_audit_time.py +2 -2
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_batch.py +1 -1
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_bean_utils.py +5 -5
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_bus.py +1 -1
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_cache_annotations.py +4 -4
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_cli.py +6 -6
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_cloud_embedded_full.py +8 -8
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_component_init_error.py +1 -1
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_compositional_annotations.py +7 -7
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_conditional_annotations.py +5 -5
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_config_binding.py +13 -13
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_config_center.py +1 -1
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_config_fixes_185.py +55 -55
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_connection_resilience.py +2 -2
- springbootai-2.3.3/tests/test_core.py +262 -0
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_core_annotations_full.py +1 -1
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_csrf.py +3 -3
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_csv_module.py +8 -8
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_data_repository.py +4 -4
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_data_rest.py +2 -2
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_datasource_routing.py +6 -6
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_ddl_auto.py +8 -8
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_declarative_aop_post_authorize_recover.py +9 -9
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_devtools.py +2 -2
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_di_config_event_full.py +6 -6
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_excel_module.py +9 -9
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_hateoas.py +1 -1
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_i18n_module.py +2 -2
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_jpa_version_transient.py +2 -2
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_kafka.py +4 -4
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_langchain_comprehensive.py +78 -78
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_langchain_ext.py +63 -63
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_langchain_module.py +20 -20
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_langgraph_comprehensive.py +6 -6
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_langgraph_module.py +2 -2
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_logging_config.py +193 -2
- springbootai-2.3.3/tests/test_lombok_annotations.py +93 -0
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_mcp_module.py +5 -5
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_metadata.py +4 -3
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_migration.py +2 -2
- springbootai-2.3.3/tests/test_nacos_config.py +110 -0
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_new_annotations.py +6 -6
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_new_features.py +29 -29
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_oauth2.py +5 -5
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_orm_pymybatis_full.py +3 -3
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_production_readiness.py +35 -35
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_pymybatis_configuration_hardening.py +4 -4
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_pymybatis_contract.py +24 -7
- springbootai-2.3.3/tests/test_request_metrics.py +100 -0
- springbootai-2.3.3/tests/test_retry.py +449 -0
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_scaffold_hardening.py +8 -8
- springbootai-2.3.3/tests/test_scheduling.py +251 -0
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_seata_at_proxy.py +1 -1
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_seata_bridge.py +5 -5
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_seata_durable_store.py +1 -1
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_security.py +15 -15
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_security_full.py +21 -5
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_security_hardening.py +8 -8
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_select_page.py +3 -3
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_startup_lifecycle.py +37 -37
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_swagger_module.py +7 -7
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_test_slicing.py +6 -6
- springbootai-2.3.3/tests/test_tracing.py +136 -0
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_transactional_events.py +3 -3
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_validation_module.py +5 -5
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_web_annotations_full.py +1 -1
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_web_root_mapping.py +2 -2
- springbootai-2.3.3/tests/test_web_security_responses.py +29 -0
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_web_static_files.py +1 -1
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_websocket_module.py +1 -1
- springbootai-2.3.2/spring/__init__.py +0 -66
- springbootai-2.3.2/spring/core/__init__.py +0 -3
- springbootai-2.3.2/spring/langchain/agents/__init__.py +0 -4
- springbootai-2.3.2/spring/langchain/callbacks/__init__.py +0 -4
- springbootai-2.3.2/spring/langchain/chains/__init__.py +0 -4
- springbootai-2.3.2/spring/langchain/indexes/__init__.py +0 -4
- springbootai-2.3.2/spring/langchain/loaders/__init__.py +0 -4
- springbootai-2.3.2/spring/langchain/memory/__init__.py +0 -4
- springbootai-2.3.2/spring/langchain/parsers/__init__.py +0 -4
- springbootai-2.3.2/spring/langchain/prompts/__init__.py +0 -4
- springbootai-2.3.2/spring/langchain/retrievers/__init__.py +0 -4
- springbootai-2.3.2/spring/langchain/tools/__init__.py +0 -4
- springbootai-2.3.2/spring/langchain/utilities/__init__.py +0 -4
- springbootai-2.3.2/spring/langchain/vectorstores/__init__.py +0 -4
- springbootai-2.3.2/springbootAI.egg-info/SOURCES.txt +0 -327
- springbootai-2.3.2/springbootAI.egg-info/entry_points.txt +0 -3
- springbootai-2.3.2/springbootAI.egg-info/top_level.txt +0 -1
- {springbootai-2.3.2 → springbootai-2.3.3}/LICENSE +0 -0
- {springbootai-2.3.2 → springbootai-2.3.3}/requirements-langgraph.txt +0 -0
- {springbootai-2.3.2 → springbootai-2.3.3}/requirements-mcp.txt +0 -0
- {springbootai-2.3.2 → springbootai-2.3.3}/setup.cfg +0 -0
- {springbootai-2.3.2 → springbootai-2.3.3}/setup.py +0 -0
- {springbootai-2.3.2 → springbootai-2.3.3}/springbootAI.egg-info/dependency_links.txt +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/ai/etl.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/ai/tools.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/annotations/batch.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/annotations/data.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/aop/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/aop/method_interceptor.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/cloud/discovery.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/cloud/seata_bridge.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/cloud/sentinel.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/cloud/tracer.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/cloud/transaction_store.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/config/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/context/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/context/registry.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/core/graceful_shutdown.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/core/typing_utils.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/csv/easy_csv.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/data/page.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/data/specification.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/datasource/context.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/datasource/dynamic.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/devtools.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/excel/converters.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/excel/easy_excel.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/excel/exceptions.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/excel/reader.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/excel/style.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/excel/writer.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/i18n/accessor.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/i18n/locale.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/i18n/locale_resolver.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/i18n/message_source.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/i18n/middleware.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/i18n/properties.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/i18n/sources.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langchain/callbacks/handlers.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langchain/loaders/loaders.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langchain/memory/memory.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langchain/prompts/templates.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langchain/retrievers/retrievers.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/langchain/utilities/utils.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/logging/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/messaging/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/messaging/kafka.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/messaging/rabbitmq.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/monitoring/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/monitoring/prometheus.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/database.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/migration.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/annotations/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/annotations/annotations.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/cache/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/cache/cache.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/cache/redis_cache.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/circuit_breaker/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/circuit_breaker/circuit_breaker.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/configuration.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/core/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/core/sql_session.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/core/sql_session_factory.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/dialect/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/dialect/dialect.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/dynamic_sql/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/dynamic_sql/dynamic_sql.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/interceptor/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/interceptor/interceptor.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/mapper/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/metrics/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/metrics/metrics.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/pool/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/pool/connection_pool.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/security/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/security/access_control.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/security/password_encoder.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/security/sensitive_data_masker.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/security/sql_injection_detector.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/transaction/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/transaction/transaction.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/type_handler/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/type_handler/type_handler.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/xml_parser/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/orm/pymybatis/xml_parser/xml_parser.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/retry/retry_annotations.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/scheduling/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/scheduling/scheduler.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/security/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/security/secret_manager.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/security/security_context.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/tracing/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/tracing/skywalking.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/tx/synchronization.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/utils/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/utils/bean_utils.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/utils/redis_client.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/validation/exceptions.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/web/__init__.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/web/interceptor.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/web/result.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/websocket/broker.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/websocket/exceptions.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/websocket/router.py +0 -0
- {springbootai-2.3.2/spring → springbootai-2.3.3/springbootai}/websocket/session.py +0 -0
- {springbootai-2.3.2 → springbootai-2.3.3}/sql/seata_undo_log.sql +0 -0
- {springbootai-2.3.2 → springbootai-2.3.3}/tests/test_starter.py +0 -0
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.3.3] - 2026-08-18
|
|
4
|
+
|
|
5
|
+
### 测试补充与文档完善
|
|
6
|
+
|
|
7
|
+
- 补充单元测试覆盖核心模块:新增 `test_core.py`(22个,覆盖 typing_utils/graceful_shutdown)、`test_retry.py`(29个,覆盖 Backoff/Retryable/@retry/recovery)、`test_scheduling.py`(18个,覆盖 cron解析/调度器)、`test_tracing.py`(17个,覆盖 LocalSpan/SkyWalkingTracer 降级)共86个测试用例
|
|
8
|
+
- 文档中文化:将 `doc/LOMBOK_MODULE.md` 等英文文档完整翻译为中文
|
|
9
|
+
- 安全加固:生产环境配置校验强化;取消 GitHub Actions 定时测试触发
|
|
10
|
+
- 完整测试套件 2964+ 个测试通过
|
|
11
|
+
|
|
12
|
+
## [2.3.2] - 2026-08-16
|
|
13
|
+
|
|
14
|
+
### 文档与打包修正
|
|
15
|
+
|
|
16
|
+
- 统一框架、文档和构建元数据版本;修正测试目录、可选依赖和生产 Profile 示例。
|
|
17
|
+
|
|
3
18
|
## [2.3.0] - 2026-08-15
|
|
4
19
|
|
|
5
20
|
### 新增
|
|
@@ -14,21 +29,21 @@
|
|
|
14
29
|
- `@EnableDataRest` — 启用 Spring Data REST(自动暴露 Repository 为 CRUD API)
|
|
15
30
|
- `@BatchJob` / `@BatchStep` — 标记批处理作业和步骤
|
|
16
31
|
- `@RepositoryRestResource` — 标记 Repository 为 REST 资源
|
|
17
|
-
- **OAuth2 资源服务器**:新增 `
|
|
18
|
-
- **CSRF 防护**:新增 `
|
|
19
|
-
- **Kafka 支持**:新增 `
|
|
20
|
-
- **DevTools 热重载**:新增 `
|
|
32
|
+
- **OAuth2 资源服务器**:新增 `springbootai/security/oauth2.py`,支持 JWT Access Token 验证,HS256 对称密钥和 RS256 公钥(JWKS)两种算法。
|
|
33
|
+
- **CSRF 防护**:新增 `springbootai/web/csrf.py`,实现 Double Submit Cookie 模式中间件。
|
|
34
|
+
- **Kafka 支持**:新增 `springbootai/messaging/kafka.py`,提供 `KafkaClient`(生产者+消费者管理)和 `@KafkaListener`/`KafkaTemplate` 注解。
|
|
35
|
+
- **DevTools 热重载**:新增 `springbootai/devtools.py`,提供 `FileWatcher`(轮询文件变更)和 `RestartTrigger`(静默期防抖)。
|
|
21
36
|
- **数据库迁移完善**:新增 Undo 回滚迁移(U{version}__{desc}.sql)、迁移锁(MySQL/PostgreSQL/SQLite)、变量替换(${var})、validate 校验方法。
|
|
22
37
|
- **Actuator /heapdump 端点**:返回 tracemalloc 内存分配快照 + GC 统计(JSON 格式),对齐 Spring Boot /actuator/heapdump。
|
|
23
|
-
- **配置元数据**:新增 `
|
|
24
|
-
- **项目脚手架**:新增 `
|
|
25
|
-
- **Spring CLI**:新增 `
|
|
38
|
+
- **配置元数据**:新增 `springbootai/config/spring-configuration-metadata.json`,IDE 可读取提供配置自动补全。
|
|
39
|
+
- **项目脚手架**:新增 `springbootai/cli/scaffold.py`,支持 `springbootai init` 命令创建新项目。
|
|
40
|
+
- **Spring CLI**:新增 `springbootai/cli/main.py`,提供 `springbootai` 统一命令入口(version/info/list/init/run/docs)。
|
|
26
41
|
- **Starter 机制**:pyproject.toml 新增 `web`/`cloud`/`all` 组合 Starter extras。
|
|
27
|
-
- **Spring Cloud Config**:新增 `
|
|
28
|
-
- **Spring Cloud Bus**:新增 `
|
|
29
|
-
- **Spring Batch**:新增 `
|
|
30
|
-
- **Spring Data REST**:新增 `
|
|
31
|
-
- **Spring HATEOAS**:新增 `
|
|
42
|
+
- **Spring Cloud Config**:新增 `springbootai/cloud/config_center.py`,支持 HTTP 和本地文件后端。
|
|
43
|
+
- **Spring Cloud Bus**:新增 `springbootai/cloud/bus.py`,支持进程内和 MQ 后端事件总线。
|
|
44
|
+
- **Spring Batch**:新增 `springbootai/batch/`,支持 Job/Step/Reader/Processor/Writer 组件。
|
|
45
|
+
- **Spring Data REST**:新增 `springbootai/data/rest.py`,自动生成 Repository CRUD REST 端点。
|
|
46
|
+
- **Spring HATEOAS**:新增 `springbootai/web/hateoas.py`,包含 Link/EntityModel/CollectionModel/PagedModel。
|
|
32
47
|
- **Sphinx API 文档**:新增 `docs/conf.py` 和 `docs/index.rst`。
|
|
33
48
|
|
|
34
49
|
### 测试
|
|
@@ -53,7 +68,7 @@
|
|
|
53
68
|
|
|
54
69
|
### 新增
|
|
55
70
|
|
|
56
|
-
- **Seata AT 数据源代理**:新增 `
|
|
71
|
+
- **Seata AT 数据源代理**:新增 `springbootai/cloud/seata_at_proxy.py`(500 行),在 ORM 拦截器层自动记录 SQL 的 before/after image,生成 undo_log,全局事务回滚时自动反向恢复数据。支持 MySQL(`%s`) 和 SQLite(`?`) 占位符自动适配。Seata 模式从三模式(local/http/distributed)扩展为四模式(新增 `at`)。
|
|
57
72
|
- **AT 代理测试**:新增 `tests/test_seata_at_proxy.py`(18 项全通过),覆盖 SQL 解析、undo_log CRUD、undo 反向恢复(INSERT→DELETE / UPDATE→UPDATE before / DELETE→INSERT before)、AT 拦截器记录、提交删除 undo_log。
|
|
58
73
|
|
|
59
74
|
### 重构
|
|
@@ -102,9 +117,12 @@
|
|
|
102
117
|
### 新增
|
|
103
118
|
|
|
104
119
|
- ORM 实体字段自动推断:类型注解无需显式 `= Column(...)` 赋值,对齐 Java JPA 字段自动映射。
|
|
105
|
-
-
|
|
106
|
-
|
|
107
|
-
-
|
|
120
|
+
-
|
|
121
|
+
ame: str` → 自动创建 `Column()`(无默认值,仅记录类型)
|
|
122
|
+
-
|
|
123
|
+
ame: str = ""` → 自动创建 `Column(default="")`(赋值即为默认值)
|
|
124
|
+
-
|
|
125
|
+
ame: int = 0` → 自动创建 `Column(default=0)`
|
|
108
126
|
- 已有 `Column()`/`Id()`/`CreateTime()` 等描述符的字段保留不覆盖
|
|
109
127
|
- 以 `_` 开头的私有字段自动跳过
|
|
110
128
|
|
|
@@ -179,9 +197,9 @@
|
|
|
179
197
|
|
|
180
198
|
### 新增
|
|
181
199
|
|
|
182
|
-
- 新增独立 `
|
|
200
|
+
- 新增独立 `springbootai.langgraph` 模块,锁定 `langgraph==1.2.9`,提供状态图、条件路由、人工中断、恢复、流式调用和注解式工作流。
|
|
183
201
|
- 新增官方 SQLite checkpointer 安全工厂;关闭 pickle fallback、限制反序列化类型,并验证连接关闭后重新打开仍能恢复流程。
|
|
184
|
-
- 新增 `
|
|
202
|
+
- 新增 `springbootai.mcp` 客户端和服务端,基于官方 MCP Python SDK,支持 Tool、Resource、Prompt 及注解调用。
|
|
185
203
|
- 新增 LangChain 和 LangGraph 注解 API;注解只负责声明,执行继续委托官方框架。
|
|
186
204
|
- 压测新增 AI、LangChain、LangGraph、MCP workload,并纳入 9 小时 mixed 稳定性脚本。
|
|
187
205
|
- CI 新增真实 MySQL、Redis、RabbitMQ、Nacos、Seata TCC 集成测试和依赖停机测试。
|
|
@@ -8,10 +8,10 @@ include requirements-langgraph.txt
|
|
|
8
8
|
include requirements-mcp.txt
|
|
9
9
|
include pyproject.toml
|
|
10
10
|
|
|
11
|
-
graft
|
|
11
|
+
graft springbootai
|
|
12
12
|
graft sql
|
|
13
13
|
|
|
14
|
-
#
|
|
14
|
+
# 鎺掗櫎寮€鍙?鏋勫缓浜х墿
|
|
15
15
|
global-exclude __pycache__
|
|
16
16
|
global-exclude *.pyc
|
|
17
17
|
global-exclude *.pyo
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: springbootAI
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.3
|
|
4
4
|
Summary: Spring-style Python framework with Web, ORM, Cloud and AI integrations
|
|
5
5
|
Author-email: YuConggen <1516933915@qq.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -63,7 +63,7 @@ Requires-Dist: langchain-core==1.5.4; extra == "ai"
|
|
|
63
63
|
Requires-Dist: langchain-classic==1.0.8; extra == "ai"
|
|
64
64
|
Requires-Dist: langchain-text-splitters==1.1.2; extra == "ai"
|
|
65
65
|
Requires-Dist: langchain-community==0.4.2; extra == "ai"
|
|
66
|
-
Requires-Dist: numpy==2.
|
|
66
|
+
Requires-Dist: numpy==2.2.6; extra == "ai"
|
|
67
67
|
Requires-Dist: pydantic==2.13.4; extra == "ai"
|
|
68
68
|
Provides-Extra: langchain
|
|
69
69
|
Requires-Dist: langchain-openai==1.4.2; extra == "langchain"
|
|
@@ -71,7 +71,7 @@ Requires-Dist: langchain-core==1.5.4; extra == "langchain"
|
|
|
71
71
|
Requires-Dist: langchain-classic==1.0.8; extra == "langchain"
|
|
72
72
|
Requires-Dist: langchain-text-splitters==1.1.2; extra == "langchain"
|
|
73
73
|
Requires-Dist: langchain-community==0.4.2; extra == "langchain"
|
|
74
|
-
Requires-Dist: numpy==2.
|
|
74
|
+
Requires-Dist: numpy==2.2.6; extra == "langchain"
|
|
75
75
|
Requires-Dist: pydantic==2.13.4; extra == "langchain"
|
|
76
76
|
Requires-Dist: faiss-cpu<2,>=1.7.4; extra == "langchain"
|
|
77
77
|
Requires-Dist: pypdf<6,>=4.0.0; extra == "langchain"
|
|
@@ -92,8 +92,8 @@ Requires-Dist: langgraph-checkpoint-sqlite==3.1.1; extra == "langgraph"
|
|
|
92
92
|
Provides-Extra: mcp
|
|
93
93
|
Requires-Dist: mcp==2.0.0; extra == "mcp"
|
|
94
94
|
Provides-Extra: web
|
|
95
|
-
Requires-Dist: fastapi==0.
|
|
96
|
-
Requires-Dist: uvicorn==0.
|
|
95
|
+
Requires-Dist: fastapi==0.141.1; extra == "web"
|
|
96
|
+
Requires-Dist: uvicorn==0.39.0; extra == "web"
|
|
97
97
|
Requires-Dist: pydantic==2.13.4; extra == "web"
|
|
98
98
|
Requires-Dist: python-multipart==0.0.20; extra == "web"
|
|
99
99
|
Provides-Extra: cloud
|
|
@@ -141,7 +141,7 @@ Requires-Dist: langchain-core==1.5.4; extra == "full"
|
|
|
141
141
|
Requires-Dist: langchain-classic==1.0.8; extra == "full"
|
|
142
142
|
Requires-Dist: langchain-text-splitters==1.1.2; extra == "full"
|
|
143
143
|
Requires-Dist: langchain-community==0.4.2; extra == "full"
|
|
144
|
-
Requires-Dist: numpy==2.
|
|
144
|
+
Requires-Dist: numpy==2.2.6; extra == "full"
|
|
145
145
|
Requires-Dist: pydantic==2.13.4; extra == "full"
|
|
146
146
|
Requires-Dist: faiss-cpu<2,>=1.7.4; extra == "full"
|
|
147
147
|
Requires-Dist: pypdf<6,>=4.0.0; extra == "full"
|
|
@@ -183,7 +183,7 @@ SpringBootAI 是一个采用 Spring 风格注解和分层结构的 Python 应用
|
|
|
183
183
|
| AI 与编排 | 模型调用、Tools、RAG、Chain、状态图、MCP client/server | LangChain / LangGraph / 官方 MCP SDK |
|
|
184
184
|
| 生产治理 | 健康检查、Prometheus、限流熔断、追踪、Swagger | prometheus-client / OpenTelemetry / OpenAPI |
|
|
185
185
|
|
|
186
|
-
当前版本是 `2.3.
|
|
186
|
+
当前版本是 `2.3.2`;支持 Python 3.10、3.11 和 3.12,许可证为 MIT。项目仍标记为 Beta。用于公网高并发、合规敏感或支付/订单/库存等核心系统前,必须完成目标数据库、流量模型、故障恢复和安全基线验证。内嵌 Gateway 适合内部路由,不替代公网 Nginx/Kong/WAF;Seata `distributed` 对接官方 TC + TCC 回调;`at` 模式通过 ORM 拦截器自动生成 undo_log 实现自动回滚。
|
|
187
187
|
|
|
188
188
|
[新手指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md) | [全部文档](https://github.com/YUCONGGEN/springbootAI/tree/master/doc) | [变更日志](https://github.com/YUCONGGEN/springbootAI/blob/master/CHANGELOG.md) | [安全报告](https://github.com/YUCONGGEN/springbootAI/blob/master/SECURITY.md) | [发布检查](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/RELEASE_CHECKLIST.md)
|
|
189
189
|
|
|
@@ -210,8 +210,8 @@ Linux/macOS 激活命令是 `source .venv/bin/activate`,其余 Python 命令
|
|
|
210
210
|
创建 `demo/Application.py`:
|
|
211
211
|
|
|
212
212
|
```python
|
|
213
|
-
from
|
|
214
|
-
from
|
|
213
|
+
from springbootai.annotations import SpringBootApplication
|
|
214
|
+
from springbootai.main import run
|
|
215
215
|
|
|
216
216
|
|
|
217
217
|
@SpringBootApplication(scan_base_packages=["demo"])
|
|
@@ -226,8 +226,8 @@ if __name__ == "__main__":
|
|
|
226
226
|
创建 `demo/controller/HelloController.py`:
|
|
227
227
|
|
|
228
228
|
```python
|
|
229
|
-
from
|
|
230
|
-
from
|
|
229
|
+
from springbootai.annotations import GetMapping, RequestMapping, RestController
|
|
230
|
+
from springbootai.web.swagger import Operation, Tag
|
|
231
231
|
|
|
232
232
|
|
|
233
233
|
@Tag(name="入门接口", description="确认应用已经正常运行")
|
|
@@ -288,10 +288,11 @@ curl http://127.0.0.1:8080/api/hello/Alice
|
|
|
288
288
|
| 📦 MCP | [MCP_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/MCP_MODULE.md) | `pip install springbootAI[mcp]` | MCP Client / Server / Tool / Resource / Prompt / 注解调用 |
|
|
289
289
|
| ✅ 内嵌 PyMyBatis ORM | [ORM_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ORM_MODULE.md) | 随核心包 | Mapper 注解 / XML Mapper / 分页 / SQL 安全 / DDL 自动建表 / Repository 分页查询 |
|
|
290
290
|
| ✅ JPA 实体与仓库 | [JPA_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/JPA_MODULE.md) | 随核心包 | `@Entity` + `@Table` / 字段自动推断 / `@CreateTime` / Repository / DataJpaTest |
|
|
291
|
+
| ✅ Lombok 模型注解 | [LOMBOK_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/LOMBOK_MODULE.md) | 随核心包 | `@Data` / `@Get` / `@Set` / `@ToString` 消除模型样板代码 |
|
|
291
292
|
| ✅ Cloud 微服务 | [CLOUD_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CLOUD_MODULE.md) | 随核心包 | 服务注册发现 / 配置刷新 / Feign / Sentinel / Gateway / 分布式事务 |
|
|
292
293
|
| 📦 消息队列 | [MESSAGING_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/MESSAGING_MODULE.md) | `pip install springbootAI[rabbitmq]` | `@RabbitListener` / `RabbitTemplate` RabbitMQ 消息收发 |
|
|
293
294
|
| 📦 Excel 读写 | [EXCEL_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/EXCEL_MODULE.md) | `pip install springbootAI[excel]` | `@ExcelProperty` / `@ExcelIgnore` 注解驱动读写 |
|
|
294
|
-
|
|
|
295
|
+
| ✅ CSV 读写 | [CSV_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CSV_MODULE.md) | 随核心包(Python 标准库 `csv`) | `@CsvProperty` / `@CsvIgnore` 注解驱动读写 |
|
|
295
296
|
| ✅ Swagger 文档 | [SWAGGER_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/SWAGGER_MODULE.md) | 随核心包 | `@Tag` / `@Operation` 注解驱动 API 文档 |
|
|
296
297
|
| ✅ 安全 | [SECURITY.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/SECURITY.md) | 随核心包 | JWT 生成校验 / 密码加密 / SQL 注入防护 / 访问控制 |
|
|
297
298
|
| ✅ BeanUtils | [BEAN_UTILS.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEAN_UTILS.md) | 随核心包 | `copy_properties` / `clone` 属性复制工具 |
|
|
@@ -363,10 +364,10 @@ SpringBootAI 是一个 **Python Web 框架**。它把 Java Spring Boot 的"注
|
|
|
363
364
|
|
|
364
365
|
| 组件 | 当前版本 |
|
|
365
366
|
|------|----------|
|
|
366
|
-
| `
|
|
367
|
-
| `
|
|
368
|
-
| `
|
|
369
|
-
| `
|
|
367
|
+
| `springbootai` 框架 API | 2.3.2 |
|
|
368
|
+
| `springbootai.orm.pymybatis` | 2.3.2 |
|
|
369
|
+
| `springbootai.ai` AI 模块 | 2.3.2 |
|
|
370
|
+
| `springbootai.langchain` LangChain 模块 | 2.3.2 |
|
|
370
371
|
| Python | 3.10+ |
|
|
371
372
|
|
|
372
373
|
### 1.4 适合什么场景
|
|
@@ -464,7 +465,7 @@ python -m pip install springbootAI
|
|
|
464
465
|
|
|
465
466
|
只有准备修改框架源码的贡献者,才需要先 `git clone`,进入仓库后执行 `python -m pip install -e .`。
|
|
466
467
|
|
|
467
|
-
核心依赖包含 FastAPI、Uvicorn、PyYAML、python-dotenv、DBUtils、PyJWT、cryptography、bcrypt 和 Pydantic。**核心安装已包含内嵌 `
|
|
468
|
+
核心依赖包含 FastAPI、Uvicorn、PyYAML、python-dotenv、DBUtils、PyJWT、cryptography、bcrypt 和 Pydantic。**核心安装已包含内嵌 `springbootai.orm.pymybatis`,使用 Mapper 模式不需要再安装独立 `pymybatis`。**
|
|
468
469
|
|
|
469
470
|
### 3.3 可选 extras
|
|
470
471
|
|
|
@@ -484,7 +485,6 @@ python -m pip install "springbootAI[mcp]"
|
|
|
484
485
|
```bash
|
|
485
486
|
python -m pip install -e ".[mysql]" # PyMySQL
|
|
486
487
|
python -m pip install -e ".[postgresql]" # psycopg2-binary
|
|
487
|
-
python -m pip install -e ".[oracle]" # cx-Oracle
|
|
488
488
|
python -m pip install -e ".[sqlalchemy]" # SQLAlchemy 模式
|
|
489
489
|
python -m pip install -e ".[redis]" # Redis 能力
|
|
490
490
|
python -m pip install -e ".[ast]" # sqlglot AST 校验
|
|
@@ -516,8 +516,8 @@ pip install langchain-chroma # Chroma 向量库
|
|
|
516
516
|
### 3.4 验证安装
|
|
517
517
|
|
|
518
518
|
```bash
|
|
519
|
-
python -c "import
|
|
520
|
-
python -c "from
|
|
519
|
+
python -c "import springbootai; print(springbootai.__version__)"
|
|
520
|
+
python -c "from springbootai.orm.pymybatis import __version__; print(__version__)"
|
|
521
521
|
```
|
|
522
522
|
|
|
523
523
|
### 3.5 最小应用
|
|
@@ -539,8 +539,8 @@ demo/
|
|
|
539
539
|
创建 `demo/Application.py`:
|
|
540
540
|
|
|
541
541
|
```python
|
|
542
|
-
from
|
|
543
|
-
from
|
|
542
|
+
from springbootai.annotations import SpringBootApplication
|
|
543
|
+
from springbootai.main import run
|
|
544
544
|
|
|
545
545
|
|
|
546
546
|
@SpringBootApplication(scan_base_packages=["demo"])
|
|
@@ -555,7 +555,7 @@ if __name__ == "__main__":
|
|
|
555
555
|
创建 `demo/controller/HelloController.py`:
|
|
556
556
|
|
|
557
557
|
```python
|
|
558
|
-
from
|
|
558
|
+
from springbootai.annotations import GetMapping, RequestMapping, RestController
|
|
559
559
|
|
|
560
560
|
|
|
561
561
|
@RequestMapping("/api")
|
|
@@ -614,7 +614,7 @@ curl http://127.0.0.1:8080/actuator/info
|
|
|
614
614
|
|
|
615
615
|
```python
|
|
616
616
|
# asgi.py
|
|
617
|
-
from
|
|
617
|
+
from springbootai.main import create_app
|
|
618
618
|
from demo.Application import Application
|
|
619
619
|
|
|
620
620
|
app = create_app(Application)
|
|
@@ -685,7 +685,7 @@ database:
|
|
|
685
685
|
### 4.5 在代码里读配置
|
|
686
686
|
|
|
687
687
|
```python
|
|
688
|
-
from
|
|
688
|
+
from springbootai.config import ConfigLoader
|
|
689
689
|
|
|
690
690
|
loader = ConfigLoader("./myapp/application.yml")
|
|
691
691
|
port = loader.get("server.port", 8080)
|
|
@@ -698,7 +698,7 @@ snapshot = loader.get_config()
|
|
|
698
698
|
### 4.6 Profile 的真实行为
|
|
699
699
|
|
|
700
700
|
```python
|
|
701
|
-
from
|
|
701
|
+
from springbootai.annotations import Profile, Service
|
|
702
702
|
|
|
703
703
|
|
|
704
704
|
@Profile("dev")
|
|
@@ -760,7 +760,7 @@ Profile 用于 Bean 过滤和生产安全校验。多环境配置可使用以下
|
|
|
760
760
|
| scan_base_packages | List[str] | None | 扫描的基础包路径 |
|
|
761
761
|
|
|
762
762
|
```python
|
|
763
|
-
from
|
|
763
|
+
from springbootai.annotations import SpringBootApplication
|
|
764
764
|
|
|
765
765
|
@SpringBootApplication(scan_base_packages=["com.example.service", "com.example.controller"])
|
|
766
766
|
class Application:
|
|
@@ -774,7 +774,7 @@ class Application:
|
|
|
774
774
|
#### @Component / @Service / @Repository
|
|
775
775
|
|
|
776
776
|
```python
|
|
777
|
-
from
|
|
777
|
+
from springbootai.annotations import Component, Service, Repository
|
|
778
778
|
|
|
779
779
|
@Component
|
|
780
780
|
class EmailUtil:
|
|
@@ -795,7 +795,7 @@ class UserRepository:
|
|
|
795
795
|
#### @Autowired
|
|
796
796
|
|
|
797
797
|
```python
|
|
798
|
-
from
|
|
798
|
+
from springbootai.annotations import Service, Autowired
|
|
799
799
|
|
|
800
800
|
@Service
|
|
801
801
|
class UserService:
|
|
@@ -818,7 +818,7 @@ class UserService:
|
|
|
818
818
|
`@RestController` 组合了 `@Controller` 和 `@ResponseBody`,返回值自动序列化为 JSON。
|
|
819
819
|
|
|
820
820
|
```python
|
|
821
|
-
from
|
|
821
|
+
from springbootai.annotations import RestController, GetMapping
|
|
822
822
|
|
|
823
823
|
@RestController
|
|
824
824
|
class UserController:
|
|
@@ -830,7 +830,7 @@ class UserController:
|
|
|
830
830
|
#### @RequestMapping / @GetMapping / @PostMapping / @PutMapping / @PatchMapping / @DeleteMapping
|
|
831
831
|
|
|
832
832
|
```python
|
|
833
|
-
from
|
|
833
|
+
from springbootai.annotations import RestController, GetMapping, PostMapping, PutMapping, PatchMapping, DeleteMapping
|
|
834
834
|
|
|
835
835
|
@RestController
|
|
836
836
|
class UserController:
|
|
@@ -858,9 +858,9 @@ class UserController:
|
|
|
858
858
|
#### @ControllerAdvice / @ExceptionHandler
|
|
859
859
|
|
|
860
860
|
```python
|
|
861
|
-
from
|
|
861
|
+
from springbootai.annotations import ControllerAdvice, ExceptionHandler
|
|
862
862
|
|
|
863
|
-
@ControllerAdvice
|
|
863
|
+
@ControllerAdvice()
|
|
864
864
|
class GlobalExceptionHandler:
|
|
865
865
|
@ExceptionHandler(ValueError, TypeError)
|
|
866
866
|
def handle_validation_error(self, e: Exception):
|
|
@@ -891,7 +891,7 @@ class GlobalExceptionHandler:
|
|
|
891
891
|
### 5.5 配置与属性注解
|
|
892
892
|
|
|
893
893
|
```python
|
|
894
|
-
from
|
|
894
|
+
from springbootai.annotations import Configuration, Bean, Service, Value, ConfigurationProperties, Component
|
|
895
895
|
|
|
896
896
|
@Configuration
|
|
897
897
|
class AppConfig:
|
|
@@ -906,7 +906,7 @@ class AppService:
|
|
|
906
906
|
self.app_name = value
|
|
907
907
|
|
|
908
908
|
@Component
|
|
909
|
-
@ConfigurationProperties(prefix="
|
|
909
|
+
@ConfigurationProperties(prefix="springbootai.datasource")
|
|
910
910
|
class DataSourceProperties:
|
|
911
911
|
def __init__(self):
|
|
912
912
|
self.url = ""
|
|
@@ -917,7 +917,7 @@ class DataSourceProperties:
|
|
|
917
917
|
### 5.6 日志与生命周期
|
|
918
918
|
|
|
919
919
|
```python
|
|
920
|
-
from
|
|
920
|
+
from springbootai.annotations import Service, Slf4j, PostConstruct, PreDestroy
|
|
921
921
|
|
|
922
922
|
@Service
|
|
923
923
|
@Slf4j # 自动创建 self.logger
|
|
@@ -941,8 +941,8 @@ class InitService:
|
|
|
941
941
|
### 5.7 应用事件
|
|
942
942
|
|
|
943
943
|
```python
|
|
944
|
-
from
|
|
945
|
-
from
|
|
944
|
+
from springbootai.annotations import ApplicationEvent, Autowired, EventListener, Service
|
|
945
|
+
from springbootai.event import ApplicationEventPublisher
|
|
946
946
|
|
|
947
947
|
|
|
948
948
|
class UserCreatedEvent(ApplicationEvent):
|
|
@@ -975,7 +975,7 @@ class UserService:
|
|
|
975
975
|
**解决什么问题**:限制接口被调用的频率,防止被刷爆。
|
|
976
976
|
|
|
977
977
|
```python
|
|
978
|
-
from
|
|
978
|
+
from springbootai.annotations import RateLimit, Service
|
|
979
979
|
|
|
980
980
|
@Service
|
|
981
981
|
class OrderService:
|
|
@@ -995,7 +995,7 @@ class OrderService:
|
|
|
995
995
|
**解决什么问题**:当某个方法持续失败时,暂时停止调用它("熔断"),等一段时间后再试。
|
|
996
996
|
|
|
997
997
|
```python
|
|
998
|
-
from
|
|
998
|
+
from springbootai.annotations import CircuitBreaker, Service
|
|
999
999
|
|
|
1000
1000
|
@Service
|
|
1001
1001
|
class PaymentService:
|
|
@@ -1014,7 +1014,7 @@ class PaymentService:
|
|
|
1014
1014
|
**解决什么问题**:用户手抖点了两次"下单",保证只有一次生效。
|
|
1015
1015
|
|
|
1016
1016
|
```python
|
|
1017
|
-
from
|
|
1017
|
+
from springbootai.annotations import Idempotent, Service
|
|
1018
1018
|
|
|
1019
1019
|
@Service
|
|
1020
1020
|
class OrderService:
|
|
@@ -1030,8 +1030,8 @@ class OrderService:
|
|
|
1030
1030
|
### 5.9 事务、缓存、任务与异步注解
|
|
1031
1031
|
|
|
1032
1032
|
```python
|
|
1033
|
-
from
|
|
1034
|
-
from
|
|
1033
|
+
from springbootai.annotations import Service, Transactional, Cacheable, Retryable, Async, Scheduled
|
|
1034
|
+
from springbootai.retry.retry_annotations import Backoff
|
|
1035
1035
|
|
|
1036
1036
|
@Service
|
|
1037
1037
|
class OrderService:
|
|
@@ -1133,7 +1133,7 @@ def create(self, order_id: str, amount: float):
|
|
|
1133
1133
|
### 6.2 构造器注入(推荐方式)
|
|
1134
1134
|
|
|
1135
1135
|
```python
|
|
1136
|
-
from
|
|
1136
|
+
from springbootai.annotations import Autowired, Service
|
|
1137
1137
|
|
|
1138
1138
|
|
|
1139
1139
|
@Service
|
|
@@ -1158,7 +1158,7 @@ class UserService:
|
|
|
1158
1158
|
### 6.4 配置类和 @Bean
|
|
1159
1159
|
|
|
1160
1160
|
```python
|
|
1161
|
-
from
|
|
1161
|
+
from springbootai.annotations import Bean, Configuration
|
|
1162
1162
|
|
|
1163
1163
|
|
|
1164
1164
|
@Configuration
|
|
@@ -1172,7 +1172,7 @@ class AppConfig:
|
|
|
1172
1172
|
### 6.5 生命周期
|
|
1173
1173
|
|
|
1174
1174
|
```python
|
|
1175
|
-
from
|
|
1175
|
+
from springbootai.annotations import Component, PostConstruct, PreDestroy
|
|
1176
1176
|
|
|
1177
1177
|
|
|
1178
1178
|
@Component
|
|
@@ -1201,7 +1201,7 @@ class ResourceHolder:
|
|
|
1201
1201
|
### 7.1 类和方法映射
|
|
1202
1202
|
|
|
1203
1203
|
```python
|
|
1204
|
-
from
|
|
1204
|
+
from springbootai.annotations import (
|
|
1205
1205
|
DeleteMapping, GetMapping, PatchMapping, PostMapping, PutMapping,
|
|
1206
1206
|
RequestMapping, RestController,
|
|
1207
1207
|
)
|
|
@@ -1236,7 +1236,7 @@ class UserController:
|
|
|
1236
1236
|
### 7.2 统一返回值
|
|
1237
1237
|
|
|
1238
1238
|
```python
|
|
1239
|
-
from
|
|
1239
|
+
from springbootai.web import Result
|
|
1240
1240
|
|
|
1241
1241
|
return Result.success({"id": 1}, message="创建成功")
|
|
1242
1242
|
return Result.bad_request("姓名不能为空")
|
|
@@ -1246,12 +1246,12 @@ return Result.not_found("用户不存在")
|
|
|
1246
1246
|
### 7.3 全局异常处理 & CORS & 拦截器
|
|
1247
1247
|
|
|
1248
1248
|
```python
|
|
1249
|
-
from
|
|
1250
|
-
from
|
|
1251
|
-
from
|
|
1249
|
+
from springbootai.annotations import ControllerAdvice, ExceptionHandler, Component
|
|
1250
|
+
from springbootai.web import Result
|
|
1251
|
+
from springbootai.web.interceptor import HandlerInterceptor
|
|
1252
1252
|
|
|
1253
1253
|
|
|
1254
|
-
@ControllerAdvice
|
|
1254
|
+
@ControllerAdvice()
|
|
1255
1255
|
class GlobalExceptionHandler:
|
|
1256
1256
|
@ExceptionHandler(ValueError)
|
|
1257
1257
|
def handle_value_error(self, error: ValueError):
|
|
@@ -1292,7 +1292,7 @@ server:
|
|
|
1292
1292
|
### 9.1 Service 事务
|
|
1293
1293
|
|
|
1294
1294
|
```python
|
|
1295
|
-
from
|
|
1295
|
+
from springbootai.annotations import Autowired, Service, Transactional
|
|
1296
1296
|
|
|
1297
1297
|
|
|
1298
1298
|
@Service
|
|
@@ -1354,7 +1354,7 @@ jwt:
|
|
|
1354
1354
|
### 10.2 access/refresh token
|
|
1355
1355
|
|
|
1356
1356
|
```python
|
|
1357
|
-
from
|
|
1357
|
+
from springbootai.security.jwt_utils import JwtUtils, jwt_utils
|
|
1358
1358
|
|
|
1359
1359
|
access = jwt_utils.generate_token({"sub": "user-1"})
|
|
1360
1360
|
refresh = jwt_utils.generate_refresh_token({"sub": "user-1"})
|
|
@@ -1367,7 +1367,7 @@ new_access = jwt_utils.refresh_token(refresh)
|
|
|
1367
1367
|
### 10.3 方法权限
|
|
1368
1368
|
|
|
1369
1369
|
```python
|
|
1370
|
-
from
|
|
1370
|
+
from springbootai.annotations import Authenticate, GetMapping, PreAuthorize, RequestMapping, RestController
|
|
1371
1371
|
|
|
1372
1372
|
|
|
1373
1373
|
@RestController
|
|
@@ -1384,7 +1384,7 @@ class AdminController:
|
|
|
1384
1384
|
|
|
1385
1385
|
### 10.4 安全基线
|
|
1386
1386
|
|
|
1387
|
-
- `SPRING_PROFILES_ACTIVE=
|
|
1387
|
+
- `SPRING_PROFILES_ACTIVE=prod` + `STARTUP_FAIL_FAST=true`
|
|
1388
1388
|
- `JWT_SECRET_KEY` 使用至少 32 字符的随机密钥
|
|
1389
1389
|
- `CORS_ALLOW_CREDENTIALS=true` 时不能用 `*` 来源
|
|
1390
1390
|
- SQL 值始终使用 `#{name}` 参数绑定
|
|
@@ -1396,7 +1396,7 @@ class AdminController:
|
|
|
1396
1396
|
### 11.1 @Cacheable
|
|
1397
1397
|
|
|
1398
1398
|
```python
|
|
1399
|
-
from
|
|
1399
|
+
from springbootai.annotations import Service, Cacheable
|
|
1400
1400
|
|
|
1401
1401
|
@Service
|
|
1402
1402
|
class UserService:
|
|
@@ -1410,8 +1410,8 @@ class UserService:
|
|
|
1410
1410
|
### 11.2 @Retryable
|
|
1411
1411
|
|
|
1412
1412
|
```python
|
|
1413
|
-
from
|
|
1414
|
-
from
|
|
1413
|
+
from springbootai.annotations import Retryable
|
|
1414
|
+
from springbootai.retry.retry_annotations import Backoff
|
|
1415
1415
|
|
|
1416
1416
|
@Retryable(value=(ConnectionError,), max_retries=3, backoff=Backoff(delay=1000, multiplier=2.0))
|
|
1417
1417
|
def call_remote(self):
|
|
@@ -1423,7 +1423,7 @@ def call_remote(self):
|
|
|
1423
1423
|
重试耗尽后可以使用 `@Recover`:
|
|
1424
1424
|
|
|
1425
1425
|
```python
|
|
1426
|
-
from
|
|
1426
|
+
from springbootai.annotations import Recover, Retryable
|
|
1427
1427
|
|
|
1428
1428
|
@Retryable(value=(ConnectionError,), max_attempts=3, backoff=200)
|
|
1429
1429
|
def call_remote(self, key):
|
|
@@ -1439,7 +1439,7 @@ def recover_remote(self, error, key):
|
|
|
1439
1439
|
### 11.3 @Async & @Scheduled
|
|
1440
1440
|
|
|
1441
1441
|
```python
|
|
1442
|
-
from
|
|
1442
|
+
from springbootai.annotations import Service, Async, Scheduled
|
|
1443
1443
|
|
|
1444
1444
|
@Service
|
|
1445
1445
|
class EmailService:
|
|
@@ -1480,14 +1480,14 @@ class CleanupJob:
|
|
|
1480
1480
|
|
|
1481
1481
|
> 完整文档:[LANGCHAIN_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/LANGCHAIN_MODULE.md)。安装:`pip install springbootAI[langchain]`。
|
|
1482
1482
|
>
|
|
1483
|
-
> 封装 langchain classic 全套:Chains / Agents(6 种) / Memory / Retrievers / VectorStores / Parsers / Loaders + 30+ 提供商。双向适配器复用 `
|
|
1483
|
+
> 封装 langchain classic 全套:Chains / Agents(6 种) / Memory / Retrievers / VectorStores / Parsers / Loaders + 30+ 提供商。双向适配器复用 `springbootai.ai` 的模型 Bean。
|
|
1484
1484
|
|
|
1485
1485
|
**最小示例**(无需 API Key):
|
|
1486
1486
|
|
|
1487
1487
|
```python
|
|
1488
|
-
from
|
|
1489
|
-
from
|
|
1490
|
-
from
|
|
1488
|
+
from springbootai.context.registry import BeanRegistry
|
|
1489
|
+
from springbootai.ai.autoconfig import configure_ai
|
|
1490
|
+
from springbootai.langchain.autoconfig import configure_langchain
|
|
1491
1491
|
|
|
1492
1492
|
registry = BeanRegistry()
|
|
1493
1493
|
configure_ai(registry=registry)
|
|
@@ -1539,7 +1539,7 @@ print(chain.run_llm_chain("回答: {q}", q="你好"))
|
|
|
1539
1539
|
**推荐构造器注入**:
|
|
1540
1540
|
|
|
1541
1541
|
```python
|
|
1542
|
-
from
|
|
1542
|
+
from springbootai.annotations import Autowired, Service
|
|
1543
1543
|
|
|
1544
1544
|
@Service
|
|
1545
1545
|
class UserService:
|
|
@@ -1575,7 +1575,7 @@ Python:
|
|
|
1575
1575
|
```python
|
|
1576
1576
|
from dataclasses import dataclass
|
|
1577
1577
|
from typing import Optional
|
|
1578
|
-
from
|
|
1578
|
+
from springbootai.orm import Mapper, Param, Select
|
|
1579
1579
|
|
|
1580
1580
|
|
|
1581
1581
|
@dataclass
|
|
@@ -1596,7 +1596,7 @@ class UserMapper:
|
|
|
1596
1596
|
| Java | SpringBootAI | 说明 |
|
|
1597
1597
|
|---|---|---|
|
|
1598
1598
|
| `@EnableDiscoveryClient` + Nacos | `@EnableDiscoveryClient` + `discovery` 配置 | 需部署 Nacos 并做集成测试 |
|
|
1599
|
-
| `@FeignClient` | 同名 + `
|
|
1599
|
+
| `@FeignClient` | 同名 + `springbootai.cloud.feign` | 不兼容 Java interface proxy |
|
|
1600
1600
|
| `@SentinelResource` | 同名 | 已内嵌引擎,无需 Dashboard |
|
|
1601
1601
|
| JPA `hibernate.ddl-auto` | `@entity` + `ddl-auto` 配置 | 支持 create/update/validate/create-drop |
|
|
1602
1602
|
|
|
@@ -1664,7 +1664,7 @@ database:
|
|
|
1664
1664
|
|
|
1665
1665
|
**生产启动**:
|
|
1666
1666
|
```bash
|
|
1667
|
-
export SPRING_PROFILES_ACTIVE=
|
|
1667
|
+
export SPRING_PROFILES_ACTIVE=prod
|
|
1668
1668
|
export JWT_SECRET_KEY="使用密钥管理系统注入至少32字符的随机值"
|
|
1669
1669
|
export STARTUP_FAIL_FAST=true
|
|
1670
1670
|
uvicorn myapp.asgi:app --host 0.0.0.0 --port 8080 --workers 4
|
|
@@ -1772,7 +1772,7 @@ python -m pytest -q tests
|
|
|
1772
1772
|
|
|
1773
1773
|
### 17.5 生产启动拒绝 JWT
|
|
1774
1774
|
|
|
1775
|
-
设置 `SPRING_PROFILES_ACTIVE=
|
|
1775
|
+
设置 `SPRING_PROFILES_ACTIVE=prod`、`STARTUP_FAIL_FAST=true`、`JWT_SECRET_KEY=<至少32字符随机密钥>`。
|
|
1776
1776
|
|
|
1777
1777
|
### 17.6 Nacos / PATCH / 配置同步排错
|
|
1778
1778
|
|
|
@@ -1961,7 +1961,7 @@ pip install springbootAI[langgraph]
|
|
|
1961
1961
|
pip install -r requirements-langgraph.txt
|
|
1962
1962
|
```
|
|
1963
1963
|
|
|
1964
|
-
完整的小白入门、配置说明、`
|
|
1964
|
+
完整的小白入门、配置说明、`springbootai.ai` 模型复用、持久化 checkpointer、异步调用和测试命令请阅读 [LANGGRAPH_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/LANGGRAPH_MODULE.md)。可选依赖已包含官方 SQLite checkpointer,适合本地单进程恢复测试;多 worker 生产环境必须注入共享数据库后端。无 LangGraph 依赖时保持 `springbootai.langgraph.enabled=false`,不会影响其他模块。
|
|
1965
1965
|
|
|
1966
1966
|
## MCP 客户端与服务端
|
|
1967
1967
|
|