javax.ws.rs.client.AsyncInvoker.get()因通用回调实现而失败

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

试图用.get()做一个异步的javax.ws.rs.client.Client请求,如下所示:

client.target("http://localhost:8080")
        .path("/sample")
        .request()
        .async()
        .get(new GenericCallback<String>());

GenericCallback看起来像这样

public final class GenericCallback<T> implements InvocationCallback<T>{
    @Override
    public void completed(T t) {
    }

    @Override
    public void failed(Throwable throwable) {
    }
}

得到这个例外

Exception in thread "main" java.lang.IllegalArgumentException: Type must not be null
    at javax.ws.rs.core.GenericType.<init>(GenericType.java:156)
    at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.submit(ClientInvocation.java:530)
    at org.jboss.resteasy.client.jaxrs.internal.AsynchronousInvoke.get(AsynchronousInvoke.java:52)

看起来org.jboss.resteasy.util.Types#getActualTypeArgumentsOfAnInterface无法为InvocationCallback获取正确的泛型类型。

写了这个例子来检查

import org.jboss.resteasy.util.Types;

import javax.ws.rs.client.InvocationCallback;
import java.lang.reflect.Type;
import java.util.Arrays;

public class GetTypeMain {
    public static void main(String[] args) {
        printTypesForCallback(new InvocationCallback<String>() {
            @Override
            public void completed(String result) {
            }

            @Override
            public void failed(Throwable throwable) {
            }
        });

        printTypesForCallback(new TypedCallback());
        printTypesForCallback(new GenericCallback<String>());
    }

    private static void printTypesForCallback(InvocationCallback<?> callback) {
        final Type[] types = Types.getActualTypeArgumentsOfAnInterface(callback.getClass(), InvocationCallback.class);
        System.out.println(Arrays.toString(types));
    }

    private static final class TypedCallback implements InvocationCallback<String> {
        @Override
        public void completed(String result) {
        }

        @Override
        public void failed(Throwable throwable) {
        }
    }

    private static final class GenericCallback<T> implements InvocationCallback<T> {
        @Override
        public void completed(T result) {
        }

        @Override
        public void failed(Throwable throwable) {
        }
    }
}

输出:

[class java.lang.String]
[class java.lang.String]
[null]

正如所料。

是否有任何解决方法来使用实现InvocationCallback的泛型类?

UPD。我使用最新版本的javax.ws.rs-apiresteasy-jaxrs

<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.1</version>
</dependency>
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jaxrs</artifactId>
    <version>3.6.1.Final</version>
</dependency>

UPD 2.更新了GenericCallback作为界面

public interface GenericCallback<T> extends InvocationCallback<T> {
    @Override
    default void completed(T result) {
    }

    @Override
    default void failed(Throwable throwable) {
    }
}

这很有效

printTypesForCallback(new GenericCallback<String>() {});

打印[class java.lang.String]

java resteasy
1个回答
0
投票

您是否尝试将通用回调定义为GenericCallback implements InvocationCallback<Object>

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