问题描述
我试图在我的休息控制器中使用 Kotlin 枚举作为查询参数,但没有任何成功。
我受影响的代码如下所示:
enum class FieldExclusion {
AUTHOR_FIELD,TIME_FIELD
}
...
@GET
fun get(
@RestPath id: UUID,@RestQuery excludedFields: List<FieldExclusion>?,@Context httpRequest: HttpServerRequest
): Uni<Response> {
...
2021-04-12 20:49:30,553 ERROR [io.qua.dep.dev.IsolatedDevModeMain] (main) Failed to start quarkus: java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build Failed due to errors
[error]: Build step io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#setupEndpoints threw an exception: java.lang.RuntimeException: java.lang.RuntimeException: Failed to process method com.kzman.zukus.user.controller.UserController#io.smallrye.mutiny.Uni<javax.ws.rs.core.Response> get(java.util.UUID id,java.util.List<? extends com.kzman.zukus.common.request.model.FieldExclusion> excludedFields,io.vertx.core.http.HttpServerRequest httpRequest)
at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.createEndpoints(EndpointIndexer.java:238)
at io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor.setupEndpoints(ResteasyReactiveProcessor.java:402)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:920)
at io.quarkus.builder.BuildContext.run(BuildContext.java:277)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2415)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1452)
at java.base/java.lang.Thread.run(Thread.java:832)
at org.jboss.threads.JBossthread.run(JBossthread.java:501)
Caused by: java.lang.RuntimeException: Failed to process method com.kzman.zukus.user.controller.UserController#io.smallrye.mutiny.Uni<javax.ws.rs.core.Response> get(java.util.UUID id,io.vertx.core.http.HttpServerRequest httpRequest)
at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.createResourceMethod(EndpointIndexer.java:526)
at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.createEndpoints(EndpointIndexer.java:285)
at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.createEndpoints(EndpointIndexer.java:209)
... 11 more
Caused by: java.lang.RuntimeException: UnkNown parameter type ? extends com.kzman.zukus.common.request.model.FieldExclusion
at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.toClassName(EndpointIndexer.java:701)
at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.extractParameterInfo(EndpointIndexer.java:889)
at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.createResourceMethod(EndpointIndexer.java:407)
... 13 more
at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:396)
at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:269)
at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:66)
at io.quarkus.deployment.dev.IsolatedDevModeMain.firstStart(IsolatedDevModeMain.java:79)
at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:378)
at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:56)
at io.quarkus.bootstrap.app.CuratedApplication.runInCl(CuratedApplication.java:127)
at io.quarkus.bootstrap.app.CuratedApplication.runInAugmentClassLoader(CuratedApplication.java:84)
at io.quarkus.deployment.dev.DevModeMain.start(DevModeMain.java:144)
at io.quarkus.deployment.dev.DevModeMain.main(DevModeMain.java:63)
Caused by: io.quarkus.builder.BuildException: Build failure: Build Failed due to errors
[error]: Build step io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#setupEndpoints threw an exception: java.lang.RuntimeException: java.lang.RuntimeException: Failed to process method com.kzman.zukus.user.controller.UserController#io.smallrye.mutiny.Uni<javax.ws.rs.core.Response> get(java.util.UUID id,io.vertx.core.http.HttpServerRequest httpRequest)
at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.createResourceMethod(EndpointIndexer.java:526)
at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.createEndpoints(EndpointIndexer.java:285)
at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.createEndpoints(EndpointIndexer.java:209)
... 11 more
Caused by: java.lang.RuntimeException: UnkNown parameter type ? extends com.kzman.zukus.common.request.model.FieldExclusion
at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.toClassName(EndpointIndexer.java:701)
at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.extractParameterInfo(EndpointIndexer.java:889)
at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.createResourceMethod(EndpointIndexer.java:407)
... 13 more
at io.quarkus.builder.Execution.run(Execution.java:116)
at io.quarkus.builder.BuildExecutionBuilder.execute(BuildExecutionBuilder.java:79)
at io.quarkus.deployment.QuarkusAugmentor.run(QuarkusAugmentor.java:153)
at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:394)
... 9 more
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: Failed to process method com.kzman.zukus.user.controller.UserController#io.smallrye.mutiny.Uni<javax.ws.rs.core.Response> get(java.util.UUID id,io.vertx.core.http.HttpServerRequest httpRequest)
at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.createResourceMethod(EndpointIndexer.java:526)
at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.createEndpoints(EndpointIndexer.java:285)
at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.createEndpoints(EndpointIndexer.java:209)
... 11 more
Caused by: java.lang.RuntimeException: UnkNown parameter type ? extends com.kzman.zukus.common.request.model.FieldExclusion
at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.toClassName(EndpointIndexer.java:701)
at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.extractParameterInfo(EndpointIndexer.java:889)
at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.createResourceMethod(EndpointIndexer.java:407)
... 13 more
2021-04-12 20:49:30,553 INFO [io.qua.dep.dev.IsolatedDevModeMain] (main) Attempting to start hot replacement endpoint to recover from prevIoUs Quarkus startup failure
创建的 documentation 表示也支持枚举类。
具有名为 valueOf 或 fromString 的静态方法以及返回类型实例的单个 String 参数的类型。如果两种方法都存在,则将使用 valueOf,除非类型是枚举,在这种情况下将使用 fromString。
由于在 Kotlin 中我无法向枚举添加静态函数(伴随乐趣),有没有办法解决它而不是使用普通字符串并手动转换它们?我还尝试向主构造函数添加一个值,但也失败了。
enum class FieldExclusion(val value : String) {
AUTHOR_FIELD("AUTHOR_FIELD"),TIME_FIELD("TIME_FIELD")
}
非常感谢您的帮助!
解决方法
我不认为这是 kotlin 的问题。 Kotlin 枚举具有预先生成的静态 valueOf,因此这不是问题。
您也可以使用 kotlin 为 jvm 添加静态方法,如下所示:
companion object {
@JvmStatic
fun fromString(text: String): A {
//TODO: do your thing
}
}
我没有看到该异常的任何部分,这表明这是该枚举的问题。我在那里遗漏了什么吗?
,这听起来像是一个错误。
请在 Quarkus GitHub 问题跟踪器上打开一个问题,并提供一个我们可以用来重现问题的项目。