首页 > 解决方案 > Nulls 使用 @Configuration 和 @Bean 与 spring boot 和 kotlin

问题描述

我正在使用Spring boot 2.3.1Kotlin 1.3.72。几天前我已经更新了它。从那一刻起,我就遇到了依赖注入的问题。我不使用@Service@Component注释,我更喜欢按@Configuration类创建 bean,所以例如我有这种配置:

@Configuration
open class MatchModule {

    @Bean
    open fun matchFacade(
            matchQueryService: MatchQueryService,
            purchaseFacade: PurchaseFacade,
            rankFacade: RankFacade,
            timeService: TimeService
    ): MatchFacade {
        return MatchFacade(
                timeService = timeService,
                matchQueryService = matchQueryService,
                purchaseFacade = purchaseFacade,
                rankFacade = rankFacade
        )
    }

    @Bean
    open fun matchQueryService(sparringViewRepository: SparringViewRepository, animalProfileMatchViewRepository: AnimalProfileMatchViewRepository): MatchQueryService {
        return MatchQueryService(sparringViewRepository, animalProfileMatchViewRepository)
    }
}

MatchFacade一个事务方法,其中所有依赖项都是null. 我知道我可以通过代理制作所有外观和方法openCGLIB但我有标准的 spring boot 构建配置pom.xml

<build>
        <sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
        <testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.jetbrains.kotlin</groupId>
                <artifactId>kotlin-maven-plugin</artifactId>
                <configuration>
                    <args>
                        <arg>-Xjsr305=strict</arg>
                    </args>
                    <compilerPlugins>
                        <plugin>spring</plugin>
                    </compilerPlugins>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.jetbrains.kotlin</groupId>
                        <artifactId>kotlin-maven-allopen</artifactId>
                        <version>${kotlin.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <artifactId>kotlin-maven-plugin</artifactId>
                <groupId>org.jetbrains.kotlin</groupId>
                <version>${kotlin.version}</version>
                <configuration>
                    <compilerPlugins>
                        <plugin>jpa</plugin>
                    </compilerPlugins>
                    <jvmTarget>1.8</jvmTarget>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.jetbrains.kotlin</groupId>
                        <artifactId>kotlin-maven-noarg</artifactId>
                        <version>${kotlin.version}</version>
                    </dependency>
                </dependencies>
                <!--...-->
            </plugin>
        </plugins>
    </build>

为什么它在没有开放类和方法的情况下不起作用?

标签: springspring-bootkotlincglib

解决方案


这是 Spring 的工作解决方案,我认为这compilerPlugins是一个缺失的部分

<plugin>
    <artifactId>kotlin-maven-plugin</artifactId>
    <groupId>org.jetbrains.kotlin</groupId>
    <version>${kotlin.version}</version>
    <configuration>
        <compilerPlugins>
            <plugin>spring</plugin>
            <plugin>jpa</plugin>
        </compilerPlugins>
        <jvmTarget>${java.version}</jvmTarget>
        <args>-java-parameters</args>
    </configuration>
    <executions>
        <execution>
            <id>compile</id>
            <phase>process-sources</phase>
            <goals>
                <goal>compile</goal>
            </goals>
        </execution>
        <execution>
            <id>test-compile</id>
            <phase>process-test-sources</phase>
            <goals>
                <goal>test-compile</goal>
            </goals>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-allopen</artifactId>
            <version>${kotlin.version}</version>
        </dependency>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-noarg</artifactId>
            <version>${kotlin.version}</version>
        </dependency>
    </dependencies>
</plugin>

推荐阅读