Java 正在将REST资源提取为列表<;T>;带球衣

Java 正在将REST资源提取为列表<;T>;带球衣,java,generics,rest,jersey,Java,Generics,Rest,Jersey,我试图在Jersey中编写一个泛型函数,该函数可用于通过REST获取相同类型的对象列表。我是根据本论坛的信息得出的: @覆盖 公共列表fetchResourceAsList(字符串url){ ClientConfig cc=newdefaultclientconfig(); Client c=Client.create(cc); 如果(用户名!=null和密码!=null){ c、 addFilter(新的HTTPBasicAuthFilter(用户名、密码)); } WebResource=c

我试图在Jersey中编写一个泛型函数,该函数可用于通过REST获取相同类型的对象列表。我是根据本论坛的信息得出的:

@覆盖
公共列表fetchResourceAsList(字符串url){
ClientConfig cc=newdefaultclientconfig();
Client c=Client.create(cc);
如果(用户名!=null和密码!=null){
c、 addFilter(新的HTTPBasicAuthFilter(用户名、密码));
}
WebResource=c.resource(url);
返回resource.get(新的GenericType(){});
}
然而,这是行不通的。如果我尝试执行它,会出现以下错误:
severy:找不到Java类Java.util.List、Java类型Java.util.List和MIME媒体类型application/xml的消息体读取器

但是,如果我编写这个函数时没有模板(用实际的类名替换T),它就可以正常工作。当然,这样函数就失去了意义


有办法解决这个问题吗?

请参阅jersey的GenericType类,它也可以帮助您

解组器需要知道对象的类型,然后才能解组返回的内容。由于泛型信息在运行时不可用,所以您所要求的是不可能的。它不可能不知道任何事情

你能做的最好的事情就是

public <T> List<T> fetchResourceAsList(Class<?> beanClass, String url) {
    ...

   if(beanCLass.equals(MyBean.class)){
      return resource.get(new GenericType<List<MyBean>>()
   }else if(...){
      ...
   }...
}
公共列表fetchResourceAsList(类beanClass,字符串url){
...
if(beanCLass.equals(MyBean.class)){
返回resource.get(新的GenericType()
}否则如果(…){
...
}...
}
或者使用泛型警告(我不确定这是否有效)

公共列表fetchResourceAsList(字符串url){
...
返回resource.get(新的GenericType()
}
我找到了解决办法

public List getAll(最后一节课){
ParameteredType ParameteredGenericType=新的ParameteredType(){
公共类型[]getActualTypeArguments(){
返回新类型[]{clazz};
}
公共类型getRawType(){
返回列表.class;
}
公共类型getOwnerType(){
返回列表.class;
}
};
GenericType GenericType=新的GenericType(
参数化(通用类型){
};
return service.path(path.ROOT).path(clazz.getSimpleName())
.accept(MediaType.APPLICATION_XML).get(genericType);
}

在user2323189上扩展时,可以使用Collection而不是List.class,这样就可以序列化扩展Collection的所有类型。我在基本客户端类中创建了一个简单的getter,可以简单地使用它来检索任何类型的集合。我的构造函数中没有提供clazz变量,因此它不是提供的argu您可能会将其转换为一个静态方法,并使用signature GenericType>和类的参数使其更通用

public GenericType<Collection<T>> getParameterizedCollectionType() {
        ParameterizedType parameterizedGenericType = new ParameterizedType() {
            public Type[] getActualTypeArguments() {
                return new Type[] { clazz };
            }

            public Type getRawType() {
                return Collection.class;
            }

            public Type getOwnerType() {
                return Collection.class;
            }
        };
        return new GenericType<Collection<T>>(parameterizedGenericType){};
    }
public GenericType getParameterizedCollectionType(){
ParameteredType ParameteredGenericType=新的ParameteredType(){
公共类型[]getActualTypeArguments(){
返回新类型[]{clazz};
}
公共类型getRawType(){
返回集合.class;
}
公共类型getOwnerType(){
返回集合.class;
}
};
返回新的GenericType(parameterizedGenericType){};
}

请参见下面的链接@fmucar:我看到的同样有关于服务器的提示。我需要客户端的泛型类型支持。您已经为服务器端提供了一个示例。这对客户端有何帮助?我可以在浏览器中查看Jersey server生成的列表。我的问题是,如果我使用泛型,客户端无法获取资源输入上面的函数。如果我每次都在某个地方为特定类型手动构造客户端,我可以获取资源。但是我不想这样。好的,我得到了。这里描述的问题与此相同:我可以问一下为什么泛型信息在运行时不可用吗?这在Jersey 2.9中对我很有效,非常感谢!!顺便说一句,继续您的示例使用了OwnerType和RawType的基类Collection.class,这也起到了作用。因此,我应该能够对所有集合类型重用单个参数化类型。
public List fetchResourceAsList(String url) {
    ...
      return resource.get(new GenericType<List<Serializable>>()
}
public <T> List<T> getAll(final Class<T> clazz) {

    ParameterizedType parameterizedGenericType = new ParameterizedType() {
        public Type[] getActualTypeArguments() {
            return new Type[] { clazz };
        }

        public Type getRawType() {
            return List.class;
        }

        public Type getOwnerType() {
            return List.class;
        }
    };

    GenericType<List<T>> genericType = new GenericType<List<T>>(
            parameterizedGenericType) {
    };

    return service.path(Path.ROOT).path(clazz.getSimpleName())
            .accept(MediaType.APPLICATION_XML).get(genericType);
}
public GenericType<Collection<T>> getParameterizedCollectionType() {
        ParameterizedType parameterizedGenericType = new ParameterizedType() {
            public Type[] getActualTypeArguments() {
                return new Type[] { clazz };
            }

            public Type getRawType() {
                return Collection.class;
            }

            public Type getOwnerType() {
                return Collection.class;
            }
        };
        return new GenericType<Collection<T>>(parameterizedGenericType){};
    }