我按照 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 问题还是其他问题?
只有当您启动 servlet 所需的运行时基础设施时,这才应该起作用 - 例如与 quarkus-undertow。 Quarkus(和指南)基于vert.x,它不支持jakarta servlet API。
扩展 azure-functions-http 实现了将 azure-runtime-api 连接到 vert.x api 所需的 适配器。
本指南不提供将servlet API 用于 azure 函数的解决方案。它提供了将 jakarta rs ws API 部署为 azure 函数的解决方案!