gpt4 book ai didi

java - 如何让 Micronaut 在外部源集中查找 Controller 接口(interface)

转载 作者:行者123 更新时间:2023-12-01 17:20:08 24 4
gpt4 key购买 nike

我有一个 micronaut 应用程序,我正在尝试使用 openapi-generator生成我的 Controller 的 stub 。该项目不直接支持 micronaut,但它支持 jax-rs API 定义 which there is micronaut support for ,所以我正在尝试使用它们。

openapi-generator生成代码到/generated/src/gen/java

TestAPI.java:

package com.owennewburn.generated.api;


import javax.ws.rs.*;
import javax.ws.rs.core.Response;

import io.swagger.annotations.*;

import java.io.InputStream;
import java.util.Map;
import java.util.List;
import javax.validation.constraints.*;
import javax.validation.Valid;

@Path("/test")
@Api(description = "the test API")
public interface TestApi {

@GET
@Produces({ "text/plain" })
@ApiOperation(value = "Test \"Hello World\" endpoint", notes = "", tags={ "test" })
@ApiResponses(value = {
@ApiResponse(code = 200, message = "success", response = String.class) })
String helloWorld();
}

我在标准 /src/main/kotlin 目录中有一个基本应用程序,我正在尝试使用此接口(interface)。

应用程序.kt:

package com.owennewburn.myapp

import io.micronaut.runtime.Micronaut

class Application: javax.ws.rs.core.Application() {

fun main(args: Array<String>) {
Micronaut.build()
.packages("com.owennewburn.")
.classes(TestController::class.java)
.mainClass(this.javaClass)
.start()
}
}

测试 Controller .kt

package com.owennewburn.myapp

import com.owennewburn.generated.api.TestApi

class TestController: TestApi {

override fun helloWorld(): String {
return "Hello World"
}
}

然后我进行了一个简单的测试,尝试执行 GET/test 并检查响应。

在这种状态下,测试将失败但如果我将接口(interface)与其余应用程序代码一起移至 src 目录,它就可以工作。有什么想法吗?在这两种情况下,代码都会构建并运行,但只有当接口(interface)位于主项目目录中时,才会在代码运行时创建端点。

最佳答案

归根结底,这是一个构建问题。在我的 build.gradle 文件中,sourceSets 看起来像:

sourceSets {
main {
kotlin {
srcDirs += 'src/main/kotlin'
srcDirs += files("${openApiSourceDir}/src/gen/java")
}
}
}

这足以成功编译代码,但只会创建 kotlin 文件的编译版本,而不是 java 接口(interface)。 Micronaut uses compile time data to implement dependency injection因此,由于类路径上没有可用的接口(interface),因此在完成包扫描以通知依赖项注入(inject)时找不到它们。

我通过将 build.gradle 更改为来修复它:

sourceSets {
main {
kotlin {
srcDirs += 'src/main/kotlin'
srcDirs += files("${openApiSourceDir}/src/gen/java")
}
java {
srcDirs += files("${openApiSourceDir}/src/gen/java")
}

}
}

关于java - 如何让 Micronaut 在外部源集中查找 Controller 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61310479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com