当前位置: 首页 > 知识库问答 >
问题:

QUKUS GraalVM URLConnection的奇怪行为

邢昊焜
2023-03-14

我正在测试旅行应用程序的Quarkus功能,当我尝试建立在基于Quarkus的GraalVM应用程序中运行的URLConnection时,我发现了一个奇怪的行为。如果我运行原生应用程序:

./target/getting-started-1.0.0-SNAPSHOT-runner

我调用RESTendpoint:

curl 'http://localhost:8080/api/v1/covid-restrictions'

然后我收到以下错误:

2022-06-01 17:38:43,844 ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (executor-thread-0) HTTP Request to /api/v1/covid-restrictions failed, error id: f6130b71-c9fb-4a67-a996-c58fba695117-1: com.amadeus.exceptions.NetworkException: [---]

但是,当我运行与Jar相同的应用程序时,一切都很好。

java -jar target/quarkus-app/quarkus-run.jar

这里有一个看到错误的例子:

    < Li > https://github . com/jabrena/quar kus-Amadeus-SDK-demo

我是否需要以某种方式为GraalVM配置Quarkus应用程序?

如果有帮助,我会分享整个StackTrace:

2022-06-01 17:38:43,844 ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (executor-thread-0) HTTP Request to /api/v1/covid-restrictions failed, error id: f6130b71-c9fb-4a67-a996-c58fba695117-1: com.amadeus.exceptions.NetworkException: [---]
        at com.amadeus.HTTPClient.fetch(HTTPClient.java:372)
        at com.amadeus.HTTPClient.execute(HTTPClient.java:358)
        at com.amadeus.HTTPClient.unauthenticatedRequest(HTTPClient.java:253)
        at com.amadeus.client.AccessToken.fetchAccessToken(AccessToken.java:67)
        at com.amadeus.client.AccessToken.updateAccessToken(AccessToken.java:53)
        at com.amadeus.client.AccessToken.lazyUpdateAccessToken(AccessToken.java:47)
        at com.amadeus.client.AccessToken.getBearerToken(AccessToken.java:39)
        at com.amadeus.HTTPClient.request(HTTPClient.java:339)
        at com.amadeus.HTTPClient.get(HTTPClient.java:67)
        at com.amadeus.dutyOfCare.diseases.Covid19AreaReport.get(Covid19AreaReport.java:51)
        at org.acme.CovidResource.hello(CovidResource.java:27)
        at org.acme.CovidResource$quarkusrestinvoker$hello_a2fbfead069e804ef1bb0315d16c4dc5e7951978.invoke(Unknown Source)
        at org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29)
        at org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:7)
        at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:141)
        at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:548)
        at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
        at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
        at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.lang.Thread.run(Thread.java:833)
        at com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:704)
        at com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:202)

提前非常感谢。

胡安·安东尼奥

共有1个答案

景辰钊
2023-03-14

与当今大多数 API 一样,艾玛迪斯库仅支持 HTTPS。
对于纯模式下的Quarkus,您需要在 src/主/资源/应用程序属性中显式启用 SSL(某些扩展除外,请参阅下面的链接)。

java prettyprint-override">quarkus.ssl.native=true

看见https://quarkus.io/guides/native-and-ssl

添加此属性后,您将得到不同的运行时错误:

2022-06-02 00:45:25,381 ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (executor-thread-0) HTTP Request to /api/v1/covid-restrictions failed, error id: 6d821ce1-23fd-4d88-8f63-992b6453830a-1: com.oracle.svm.core.jdk.UnsupportedFeatureError: Code that was considered unreachable by closed-world analysis was reached.

尝试注册以下反射类(DiseaseAreaReport和所有内部类),因为Amadeus将使用GSON,因此也使用Java反射将JSON字符串数据应用于DiseaseAreReport POJO。https://quarkus.io/guides/writing-native-applications-tips#registering-反省

package org.acme;

import io.quarkus.runtime.annotations.RegisterForReflection;

@RegisterForReflection(targets = {
        com.amadeus.Amadeus.class,
        com.amadeus.HTTPClient.class,
        com.amadeus.Params.class,
        com.amadeus.Response.class,
        com.amadeus.client.AccessToken.class,
        com.amadeus.dutyOfCare.diseases.Covid19AreaReport.class,
        com.amadeus.exceptions.ResponseException.class,
        // com.amadeus.resources.DiseaseAreaReport and all inner classes
        com.amadeus.resources.DiseaseAreaReport.class,
        com.amadeus.resources.DiseaseAreaReport.Area.class,
        com.amadeus.resources.DiseaseAreaReport.AreaAccessRestriction.class,
        com.amadeus.resources.DiseaseAreaReport.AreaPolicy.class,
        com.amadeus.resources.DiseaseAreaReport.AreaRestriction.class,
        com.amadeus.resources.DiseaseAreaReport.AreaVaccinated.class,
        com.amadeus.resources.DiseaseAreaReport.Border.class,
        com.amadeus.resources.DiseaseAreaReport.DatedInformation.class,
        com.amadeus.resources.DiseaseAreaReport.DatedQuarantineRestriction.class,
        com.amadeus.resources.DiseaseAreaReport.DatedTracingApplicationRestriction.class,
        com.amadeus.resources.DiseaseAreaReport.DeclarationDocuments.class,
        com.amadeus.resources.DiseaseAreaReport.DiseaseCase.class,
        com.amadeus.resources.DiseaseAreaReport.DiseaseInfection.class,
        com.amadeus.resources.DiseaseAreaReport.DiseaseTestingRestriction.class,
        com.amadeus.resources.DiseaseAreaReport.DiseaseVaccination.class,
        com.amadeus.resources.DiseaseAreaReport.EntryRestriction.class,
        com.amadeus.resources.DiseaseAreaReport.ExitRestriction.class,
        com.amadeus.resources.DiseaseAreaReport.GeoCode.class,
        com.amadeus.resources.DiseaseAreaReport.Link.class,
        com.amadeus.resources.DiseaseAreaReport.MaskRestriction.class,
        com.amadeus.resources.DiseaseAreaReport.Sources.class,
        com.amadeus.resources.DiseaseAreaReport.Transportation.class,
        com.amadeus.resources.DiseaseAreaReport.ValidityPeriod.class,
        com.amadeus.resources.Resource.class
})
public class AmadeusReflection {

}

我希望这解决了这个问题,如果不是更深入地挖掘,那么哪些类或内部类缺少注册,以便使用调试器或跟踪堆栈跟踪进行反射。

P、 S.您的测试显示以下警告:

[WARNING] [io.quarkus.resteasy.reactive.server.deployment.QuarkusServerEndpointIndexer] Quarkus detected the use of JSON in JAX-RS method 'org.acme.CovidResource#hello' but no JSON extension has been added. Consider adding 'quarkus-resteasy-reactive-jackson' or 'quarkus-resteasy-reactive-jsonb'.
[WARNING] [io.quarkus.resteasy.reactive.server.deployment.QuarkusServerEndpointIndexer] Quarkus detected the use of JSON in JAX-RS method 'org.acme.ConfigResource#hello' but no JSON extension has been added. Consider adding 'quarkus-resteasy-reactive-jackson' or 'quarkus-resteasy-reactive-jsonb'.

考虑在< code>pom.xml中添加RESTEasy Reactive Jackson扩展:

<dependency>
  <groupId>io.quarkus</groupId>
  <artifactId>quarkus-resteasy-reactive-jackson</artifactId>
</dependency>
 类似资料:
  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 问题内容: 我在GregorianCalendar类中遇到一个奇怪的行为,我想知道我是否真的做得不好。 仅当初始化日期的月份的实际Maximum大于我将日历设置为的月份时,才追加此值。 这是示例代码: 我知道问题是由于日历初始化日期是31天(可能是5月),与设置为2月(28天)的月份混淆了。修复很容易(只需在设置年和月之前将day_of_month设置为1),但是我想知道这确实是想要的行为。有什么

  • 问题内容: 我正在为一个问题而苦苦挣扎,我不明白为什么它不起作用。如何通过将变量传递并转换为? 为什么在顶部代码段中不起作用,但在行下方的底部代码段中起作用? 唯一的区别似乎是添加了一个额外的变量,该变量也被键入为? 问题答案: 该是一种原始类型,同时是一个普通的Java类。您不能在原始类型上调用方法。但是该方法在上可用,如javadoc中所示 有关这些原始类型的更多信息,请参见此处

  • 问题内容: 为什么的到哪里去了? 问题答案: 删除任何字符,并从字符串的开头和结尾。

  • 问题内容: 我认为这是一个正常程序,但这是我得到的输出: 有人可以向我解释一下吗? 问题答案: 这是有据可查的PHP行为,请参阅php.net的foreach页面上的警告。 警告 即使在 foreach 循环之后,仍保留 $ value的 引用和最后一个数组元素。建议通过unset()销毁它。 __ 编辑 尝试逐步了解此处实际发生的情况

  • 问题内容: 我有上面的代码,但我不知道为什么会产生 而不是 非常感谢 问题答案: 使用量词来匹配1个或多个空格,而不是:- 表示匹配0个或多个空格,并且将在每个字符之前匹配一个空字符,并由一个空格代替。

  • 我正在Glassfish 4.1上制作一个Java EE 7应用程序(war) 该应用程序是一个简单的CRUD应用程序 为了测试CRUD操作,我制作了一个Java SE客户端(使用Jersey2客户端api)。奇怪的行为是HTTP POST创建没有检测到对象的一个字段: 我有一个“birthDate”属性,它在服务器端总是为“null”<我不明白为什么会发生这种情况以及如何解决? 以下是我在服务器

  • 我在用C来解决这个问题。 代码是使用编译的。 整个解决方案都在github上。存储库包含两个cpp文件:main。cpp和哲学家。cpp。“Main.cpp”创建互斥变量、信号量、5个条件变量、5个分叉并启动。信号量仅用于同步开始时间。其他参数被传递给哲学家来解决问题。“哲学家.cpp”包含给定问题的解决方案,但经过几个步骤后,死锁就会发生。 当哲学家0正在吃饭,而哲学家1(在他旁边)想要拿叉子时