Azure 函数(使用 Quarkus)仅在部署时在 POST 上出现 RpcHttpRequestDataSource 错误

问题描述 投票:0回答:1

我按照 Quarkus Azure Functions 指南 创建了一个新项目。我向 vert.x 问候语类和 servlet 类添加了一个 POST。两者都返回没有正文的 500,并且从 Application Insights 页面查看时,包含与将 RpcHttpRequestDataSource 转换为 byte[] 相关的类似错误。但在本地,两者都工作正常。

这是 servlet POST,它在通过

mvn quarkus:dev
本地运行时起作用:

import java.io.IOException;
import java.util.stream.Collectors;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "ServletGreeting", urlPatterns = "/servlet/hello")
public class GreetingServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setStatus(200);
        resp.addHeader("Content-Type", "text/plain");
        resp.getWriter().write("hello servlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        resp.setStatus(200);
        resp.addHeader("Content-Type", "text/plain");;
        resp.getWriter().write("hello " + req.getReader().lines().collect(Collectors.joining(System.lineSeparator())));
    }
}
    Exception while executing function: Functions.quarkus Result: Failure
    Exception: ClassCastException: Cannot convert com.microsoft.azure.functions.worker.binding.RpcHttpRequestDataSource@7e569681to type com.microsoft.azure.functions.HttpRequestMessage<java.util.Optional<byte[]>>
    Stack: java.lang.ClassCastException: Cannot convert com.microsoft.azure.functions.worker.binding.RpcHttpRequestDataSource@7e569681to type com.microsoft.azure.functions.HttpRequestMessage<java.util.Optional<byte[]>>
        at com.microsoft.azure.functions.worker.binding.DataOperations.generalAssignment(DataOperations.java:191)
        at com.microsoft.azure.functions.worker.binding.DataOperations.apply(DataOperations.java:120)
        at com.microsoft.azure.functions.worker.binding.DataSource.computeByType(DataSource.java:56)
        at com.microsoft.azure.functions.worker.binding.RpcHttpRequestDataSource.computeByType(RpcHttpRequestDataSource.java:20)
        at com.microsoft.azure.functions.worker.binding.DataSource.computeByName(DataSource.java:42)
        at com.microsoft.azure.functions.worker.binding.RpcHttpRequestDataSource.computeByName(RpcHttpRequestDataSource.java:20)
        at com.microsoft.azure.functions.worker.binding.BindingDataStore.getDataByName(BindingDataStore.java:55)
        at com.microsoft.azure.functions.worker.broker.ParameterResolver.resolve(ParameterResolver.java:59)
        at com.microsoft.azure.functions.worker.broker.ParameterResolver.resolve(ParameterResolver.java:42)
        at com.microsoft.azure.functions.worker.broker.JavaMethodExecutorImpl.execute(JavaMethodExecutorImpl.java:52)
        at com.microsoft.azure.functions.worker.broker.JavaFunctionBroker.invokeMethod(JavaFunctionBroker.java:57)
        at com.microsoft.azure.functions.worker.handler.InvocationRequestHandler.execute(InvocationRequestHandler.java:33)
        at com.microsoft.azure.functions.worker.handler.InvocationRequestHandler.execute(InvocationRequestHandler.java:10)
        at com.microsoft.azure.functions.worker.handler.MessageHandler.handle(MessageHandler.java:45)
        at com.microsoft.azure.functions.worker.JavaWorkerClient$StreamingMessagePeer.lambda$onNext$0(JavaWorkerClient.java:92)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

这是 Quarkus 问题还是其他问题?

java servlets azure-functions vert.x quarkus
1个回答
0
投票

只有当您启动 servlet 所需的运行时基础设施时,这才应该起作用 - 例如与 quarkus-undertowQuarkus(和指南)基于vert.x,它不支持jakarta servlet API

扩展 azure-functions-http 实现了将 azure-runtime-api 连接到 vert.x api 所需的 适配器

本指南不提供将

servlet API 用于 azure 函数的解决方案。它提供了将 jakarta rs ws API 部署为 azure 函数的解决方案!

© www.soinside.com 2019 - 2024. All rights reserved.