diff --git a/novalon-manage-api/manage-app/src/main/java/cn/novalon/manage/app/ManageApplication.java b/novalon-manage-api/manage-app/src/main/java/cn/novalon/manage/app/ManageApplication.java index bc5566c..7f788f4 100644 --- a/novalon-manage-api/manage-app/src/main/java/cn/novalon/manage/app/ManageApplication.java +++ b/novalon-manage-api/manage-app/src/main/java/cn/novalon/manage/app/ManageApplication.java @@ -1,16 +1,24 @@ package cn.novalon.manage.app; +import cn.novalon.manage.sys.core.service.IOperationLogService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration; import org.springframework.boot.context.properties.ConfigurationPropertiesScan; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.data.r2dbc.repository.config.EnableR2dbcRepositories; +import org.springframework.web.server.WebFilter; -@SpringBootApplication(scanBasePackages = "cn.novalon.manage", exclude = {ReactiveUserDetailsServiceAutoConfiguration.class}) -@EnableR2dbcRepositories(basePackages = {"cn.novalon.manage.db.dao", "cn.novalon.manage.sys.audit.repository"}) +import java.util.List; + +@SpringBootApplication(scanBasePackages = "cn.novalon.manage", exclude = { + ReactiveUserDetailsServiceAutoConfiguration.class }) +@EnableR2dbcRepositories(basePackages = { "cn.novalon.manage.db.dao", + "cn.novalon.manage.sys.audit.repository" }) public class ManageApplication { private static final Logger logger = LoggerFactory.getLogger(ManageApplication.class); @@ -18,9 +26,32 @@ public class ManageApplication { public static void main(String[] args) { logger.info("应用程序启动中..."); logger.info("包扫描路径: cn.novalon.manage"); - - // 使用简单的启动方式,避免自动配置问题 + SpringApplication.run(ManageApplication.class, args); logger.info("应用程序启动完成"); } + + @Bean + public CommandLineRunner checkWebFilters(List webFilters) { + return args -> { + logger.info("=== 检查已注册的 WebFilter ==="); + logger.info("WebFilter 总数: {}", webFilters.size()); + for (WebFilter filter : webFilters) { + logger.info(" - {} (Order: {})", + filter.getClass().getName(), + filter.getClass().getAnnotation(org.springframework.core.annotation.Order.class) != null + ? filter.getClass().getAnnotation(org.springframework.core.annotation.Order.class) + .value() + : "无"); + } + }; + } + + @Bean + public CommandLineRunner checkOperationLogService(IOperationLogService service) { + return args -> { + logger.info("=== 检查 IOperationLogService ==="); + logger.info("IOperationLogService 实现: {}", service.getClass().getName()); + }; + } } diff --git a/novalon-manage-api/manage-app/src/main/java/cn/novalon/manage/app/config/DataSourceConfig.java b/novalon-manage-api/manage-app/src/main/java/cn/novalon/manage/app/config/DataSourceConfig.java new file mode 100644 index 0000000..dbf8071 --- /dev/null +++ b/novalon-manage-api/manage-app/src/main/java/cn/novalon/manage/app/config/DataSourceConfig.java @@ -0,0 +1,29 @@ +package cn.novalon.manage.app.config; + +import com.zaxxer.hikari.HikariDataSource; +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import javax.sql.DataSource; + +@Configuration +public class DataSourceConfig { + + @Bean + @Primary + @ConfigurationProperties("spring.datasource") + public DataSourceProperties dataSourceProperties() { + return new DataSourceProperties(); + } + + @Bean + @Primary + public DataSource dataSource(DataSourceProperties properties) { + return properties.initializeDataSourceBuilder() + .type(HikariDataSource.class) + .build(); + } +} diff --git a/novalon-manage-api/manage-app/src/main/java/cn/novalon/manage/app/config/JacksonConfig.java b/novalon-manage-api/manage-app/src/main/java/cn/novalon/manage/app/config/JacksonConfig.java index 7e32ee6..2714453 100644 --- a/novalon-manage-api/manage-app/src/main/java/cn/novalon/manage/app/config/JacksonConfig.java +++ b/novalon-manage-api/manage-app/src/main/java/cn/novalon/manage/app/config/JacksonConfig.java @@ -3,6 +3,8 @@ package cn.novalon.manage.app.config; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; @@ -39,6 +41,12 @@ public class JacksonConfig { javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); objectMapper.registerModule(javaTimeModule); + + SimpleModule longModule = new SimpleModule(); + longModule.addSerializer(Long.class, ToStringSerializer.instance); + longModule.addSerializer(Long.TYPE, ToStringSerializer.instance); + objectMapper.registerModule(longModule); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); diff --git a/novalon-manage-api/manage-app/src/main/java/cn/novalon/manage/app/config/TransactionManagerConfig.java b/novalon-manage-api/manage-app/src/main/java/cn/novalon/manage/app/config/TransactionManagerConfig.java new file mode 100644 index 0000000..41e71af --- /dev/null +++ b/novalon-manage-api/manage-app/src/main/java/cn/novalon/manage/app/config/TransactionManagerConfig.java @@ -0,0 +1,25 @@ +package cn.novalon.manage.app.config; + +import io.r2dbc.spi.ConnectionFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.transaction.ReactiveTransactionManager; +import org.springframework.transaction.reactive.TransactionalOperator; +import org.springframework.r2dbc.connection.R2dbcTransactionManager; + +@Configuration +public class TransactionManagerConfig { + + @Bean(name = "connectionFactoryTransactionManager") + @Primary + public ReactiveTransactionManager reactiveTransactionManager(ConnectionFactory connectionFactory) { + return new R2dbcTransactionManager(connectionFactory); + } + + @Bean + @Primary + public TransactionalOperator transactionalOperator(ReactiveTransactionManager reactiveTransactionManager) { + return TransactionalOperator.create(reactiveTransactionManager); + } +}