kotlin 用Quarkus和Reactor重写DNC滤波器中的数据流

yshpjwxd  于 2023-10-23  发布在  Kotlin
关注(0)|答案(1)|浏览(222)

我有一个webhook从侧面服务,我试图使一个过滤器在前面的控制器,检查签名。类似于Spring Security风格,但不幸的是,它是Quarkus with Reactor。在控制器中,我有null,调试器甚至没有实现控制器方法。
我的目标是:
1.检查签名我需要一个头部和身体,它和WebhookHandlerUtility不是mt类,我不能改变它。和WebhookHandlerUtility.verifySignature(signature, body)同步方法,我不能改变它。
1.我需要重写流,因为我希望在控制器中接收此数据作为主体。
我的实现有什么问题以及如何修复它?

  1. @Provider
  2. class SignatureFilter(
  3. private val objectMapper: ObjectMapper,
  4. private val webhookHandlerUtility: WebhookHandlerUtility
  5. ) : ContainerRequestFilter {
  6. private val executor = Executors.newFixedThreadPool(5)
  7. @Throws(IOException::class)
  8. override fun filter(requestContext: ContainerRequestContext) {
  9. executor.execute {
  10. val signature = requestContext.getHeaderString("signature")
  11. val body = requestContext.entityStream.reader().readText()
  12. if (!webhookHandlerUtility.verifySignature(signature, body)) {
  13. throw TerraSignatureVerificationException()
  14. }
  15. val payload = webhookHandlerUtility.parseWebhookPayload(body)
  16. ?: throw TerraWebHookPayloadParseException()
  17. val json = objectMapper.writeValueAsString(payload.raw)
  18. val newInputStream = ByteArrayInputStream(json.toByteArray())
  19. requestContext.entityStream = newInputStream
  20. }
  21. }
  22. }
  23. @ApplicationScoped
  24. @Path("/webHook")
  25. class WebHookController(
  26. private val omronService: OmronService
  27. ) {
  28. @POST
  29. @Path("/device")//,
  30. @Consumes(MediaType.APPLICATION_JSON)
  31. fun omronWebHook(req: HookDto): Uni<Response> {
  32. log.info("Received data: $req")
  33. return omronService.save(req)
  34. .map { Response.noContent().build() }
  35. }
  36. }
  1. 2023-09-29 14:30:46,346 DEBUG [org.jbo.res.rea.ser.han.ParameterHandler] (vert.x-eventloop-thread-0) Error occurred during parameter extraction:
  2. javax.enterprise.inject.UnsatisfiedResolutionException: No bean found for required type [interface javax.ws.rs.container.ContainerRequestContext] and qualifiers [[]]
  3. at io.quarkus.arc.impl.InstanceImpl.bean(InstanceImpl.java:190)
  4. at io.quarkus.arc.impl.InstanceImpl.getInternal(InstanceImpl.java:211)
  5. at io.quarkus.arc.impl.InstanceImpl.get(InstanceImpl.java:97)
  6. at org.jboss.resteasy.reactive.server.core.parameters.ContextParamExtractor.extractParameter(ContextParamExtractor.java:100)
  7. at org.jboss.resteasy.reactive.server.handlers.ParameterHandler.handle(ParameterHandler.java:45)
  8. at io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:111)
  9. at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:142)
  10. at org.jboss.resteasy.reactive.server.handlers.RestInitialHandler.beginProcessing(RestInitialHandler.java:51)
  11. at org.jboss.resteasy.reactive.server.vertx.ResteasyReactiveVertxHandler.handle(ResteasyReactiveVertxHandler.java:18)
  12. at org.jboss.resteasy.reactive.server.vertx.ResteasyReactiveVertxHandler.handle(ResteasyReactiveVertxHandler.java:8)
  13. at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1284)
  14. at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:173)
  15. at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:140)
  16. at io.quarkus.vertx.http.runtime.StaticResourcesRecorder$2.handle(StaticResourcesRecorder.java:84)
  17. at io.quarkus.vertx.http.runtime.StaticResourcesRecorder$2.handle(StaticResourcesRecorder.java:71)
  18. at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1284)
  19. at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:173)
  20. at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:140)
  21. at io.quarkus.vertx.http.runtime.VertxHttpRecorder$6.handle(VertxHttpRecorder.java:430)
  22. at io.quarkus.vertx.http.runtime.VertxHttpRecorder$6.handle(VertxHttpRecorder.java:408)
  23. at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1284)
  24. at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:173)
  25. at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:140)
  26. at io.quarkus.vertx.http.runtime.devmode.VertxHttpHotReplacementSetup$5.handle(VertxHttpHotReplacementSetup.java:196)
  27. at io.quarkus.vertx.http.runtime.devmode.VertxHttpHotReplacementSetup$5.handle(VertxHttpHotReplacementSetup.java:185)
  28. at io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:141)
  29. at io.vertx.core.impl.future.FutureBase.lambda$emitSuccess$0(FutureBase.java:54)
  30. at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
  31. at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
  32. at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
  33. at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
  34. at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
  35. at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
  36. at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
  37. at java.base/java.lang.Thread.run(Thread.java:833)
  38. 2023-09-29 14:30:46,349 DEBUG [org.jbo.res.rea.com.cor.AbstractResteasyReactiveContext] (vert.x-eventloop-thread-0) Restarting handler chain for exception exception:
  39. javax.ws.rs.WebApplicationException: HTTP 400 Bad Request
  40. at org.jboss.resteasy.reactive.server.handlers.ParameterHandler.handle(ParameterHandler.java:66)
  41. at io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:111)
  42. at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:142)
  43. at org.jboss.resteasy.reactive.server.handlers.RestInitialHandler.beginProcessing(RestInitialHandler.java:51)
  44. at org.jboss.resteasy.reactive.server.vertx.ResteasyReactiveVertxHandler.handle(ResteasyReactiveVertxHandler.java:18)
  45. at org.jboss.resteasy.reactive.server.vertx.ResteasyReactiveVertxHandler.handle(ResteasyReactiveVertxHandler.java:8)
  46. at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1284)
  47. at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:173)
  48. at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:140)
  49. at io.quarkus.vertx.http.runtime.StaticResourcesRecorder$2.handle(StaticResourcesRecorder.java:84)
  50. at io.quarkus.vertx.http.runtime.StaticResourcesRecorder$2.handle(StaticResourcesRecorder.java:71)
  51. at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1284)
  52. at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:173)
  53. at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:140)
  54. at io.quarkus.vertx.http.runtime.VertxHttpRecorder$6.handle(VertxHttpRecorder.java:430)
  55. at io.quarkus.vertx.http.runtime.VertxHttpRecorder$6.handle(VertxHttpRecorder.java:408)
  56. at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1284)
  57. at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:173)
  58. at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:140)
  59. at io.quarkus.vertx.http.runtime.devmode.VertxHttpHotReplacementSetup$5.handle(VertxHttpHotReplacementSetup.java:196)
  60. at io.quarkus.vertx.http.runtime.devmode.VertxHttpHotReplacementSetup$5.handle(VertxHttpHotReplacementSetup.java:185)
  61. at io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:141)
  62. at io.vertx.core.impl.future.FutureBase.lambda$emitSuccess$0(FutureBase.java:54)
  63. at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
  64. at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
  65. at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
  66. at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
  67. at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
  68. at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
  69. at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
  70. at java.base/java.lang.Thread.run(Thread.java:833)
  71. Caused by: javax.enterprise.inject.UnsatisfiedResolutionException: No bean found for required type [interface javax.ws.rs.container.ContainerRequestContext] and qualifiers [[]]
  72. at io.quarkus.arc.impl.InstanceImpl.bean(InstanceImpl.java:190)
  73. at io.quarkus.arc.impl.InstanceImpl.getInternal(InstanceImpl.java:211)
  74. at io.quarkus.arc.impl.InstanceImpl.get(InstanceImpl.java:97)
  75. at org.jboss.resteasy.reactive.server.core.parameters.ContextParamExtractor.extractParameter(ContextParamExtractor.java:100)
  76. at org.jboss.resteasy.reactive.server.handlers.ParameterHandler.handle(ParameterHandler.java:45)
  77. ... 30 more
  78. 2023-09-29 14:30:46,358 INFO [http-problem] (vert.x-eventloop-thread-0) status=400, title="Bad Request", detail="HTTP 400 Bad Request"
  79. Exception in thread "pool-6-thread-1" java.lang.IllegalStateException: Cannot be called from response filter
  80. at org.jboss.resteasy.reactive.server.jaxrs.ContainerRequestContextImpl.assertNotResponse(ContainerRequestContextImpl.java:94)
  81. at org.jboss.resteasy.reactive.server.jaxrs.ContainerRequestContextImpl.setEntityStream(ContainerRequestContextImpl.java:158)
  82. at com.dfskjhzxk.terra.configuration.SignatureFilter.filter$lambda$0(SignatureFilter.kt:41)
  83. at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
  84. at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
  85. at java.base/java.lang.Thread.run(Thread.java:833)
r6l8ljro

r6l8ljro1#

问题是,你试图从一个不是由Quarkus管理的线程访问一个请求作用域的bean(因为你正在使用自己的执行器)。
一个简单的补救方法是在filter方法本身中访问ContainerRequestContext中所需的任何内容,而不是在用作线程Runnable的lambda中访问前者

相关问题