Nag*_*gyI 17 java generics rest jersey
我正在尝试在Jersey中编写一个泛型函数,它可以用来通过REST获取相同类型的对象列表.我的基础是这个论坛中的信息:链接
@Override
public <T> List<T> fetchResourceAsList(String url) {
ClientConfig cc = new DefaultClientConfig();
Client c = Client.create(cc);
if (userName!=null && password!=null) {
c.addFilter(new HTTPBasicAuthFilter(userName, password));
}
WebResource resource = c.resource(url);
return resource.get(new GenericType<List<T>>() {});
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用.如果我尝试执行它,我会收到以下错误:SEVERE: A message body reader for Java class java.util.List, and Java type java.util.List<T>, and MIME media type application/xml was not found
.
但是,如果我在没有模板化的情况下编写此函数(用实际的类名替换T),它就可以正常工作.当然,这种功能失去了它的意义.
有没有办法来解决这个问题?
小智 24
我找到了解决方案 https://java.net/projects/jersey/lists/users/archive/2011-08/message/37
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);
}
Run Code Online (Sandbox Code Playgroud)
请参阅GenericType类的球衣,这也可能对您有所帮助
Unmarshaller需要知道对象的类型,然后才能取消归还返回的内容.由于泛型信息在运行时不可用,因此您无法提出要求.它不能解决它不知道的事情.
你能做的最好的是;
public <T> List<T> fetchResourceAsList(Class<?> beanClass, String url) {
...
if(beanCLass.equals(MyBean.class)){
return resource.get(new GenericType<List<MyBean>>()
}else if(...){
...
}...
}
Run Code Online (Sandbox Code Playgroud)
或者使用泛型警告(我不确定这是否有效)
public List fetchResourceAsList(String url) {
...
return resource.get(new GenericType<List<Serializable>>()
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
22560 次 |
最近记录: |