Java CompletableFuture + Resteasy

m14*_*416 5 java resteasy java-8 completable-future

我一直在使用 Java 的 CompletableFuture 这样

CompletableFuture.runAsync(() -> {//Some code here });
Run Code Online (Sandbox Code Playgroud)

当我尝试在此代码块中使用 Resteasy Client 时,我得到一个

javax.ws.rs.ProcessingException: Unable to find a MessageBodyReader of content-type application/json;charset=utf-8 and type class java.lang.String
Run Code Online (Sandbox Code Playgroud)

如果我在 completablefuture 之外使用客户端,则它可以工作。Resteasy 代码看起来像这样

        ResteasyClient client = new ResteasyClientBuilder().build();
        client.register(new AcceptEncodingFilter("gzip"));
        ResteasyWebTarget target = client.target(exampleURL);

        target = target.queryParam("1", 1)
                .queryParam("2", "1")
                .queryParam("3", 3)
                .queryParam("4", 4)
                .queryParam("5", "5");

        Response response = target.request().get();
        resultString = response.readEntity(String.class);
Run Code Online (Sandbox Code Playgroud)

我将在 completablefuture 之外运行 resteasy 代码来“修复”问题,但想了解为什么会发生这种情况。

CompletableFuture 中的 resteasy 代码如下所示:

CompletableFuture.runAsync(() -> {
            try {
                ResteasyClient client = new ResteasyClientBuilder().build();
                client.register(new AcceptEncodingFilter("gzip"));
                ResteasyWebTarget target = client.target("http://test.com");

                target = target.queryParam("1", "1")
                        .queryParam("2", "2")
                        .queryParam("3", "3")
                        .queryParam("4", "4")
                        .queryParam("5", "5");

                Response response = target.request().get();
                String resultString = response.readEntity(String.class);

                response.close();
                client.close();
            } catch (Exception e){
                e.printStackTrace();
            }
        });
Run Code Online (Sandbox Code Playgroud)

CompletableFuture 之外的相同代码有效

ken*_*i62 0

我在 Wildfly 26.1.3 中遇到了这个问题,我相信它使用的是 RestEasy 4.7.7。如果 RestEasy 以“正常”方法使用,它就会起作用。如果在 CompletableFuture.runAsync 创建的线程中使用它,则会失败并显示“无法找到 MessageBodyReader”错误消息。

我使用调试器查看发生了什么,发现 RestEasy 客户端在线程中创建时未正确配置。我能够通过创建客户端来解决该问题,如下所示:

Configuration configuration = LocalResteasyProviderFactory.getInstance().getConfiguration();
Client client = ClientBuilder.newClient(configuration);
Run Code Online (Sandbox Code Playgroud)

添加此代码会导致 Wildfly server.log 中出现警告:

RESTEASY002155: Provider class org.jboss.resteasy.plugins.providers.jackson.PatchMethodFilter is already registered.  2nd registration is being ignored
Run Code Online (Sandbox Code Playgroud)

编辑:经过进一步研究,正确的答案是用于ManagedScheduledExecutorService执行异步任务,而不是 CompletableFuture。这可确保 RestEasy 配置正确初始化。