我基于Spring MVC的RESTful服务。 该服务具有RESTful资源方法,该方法返回以下响应:
public class OperationalDataResponse<T> {
private String status;
private String statusMessage;
private T result;
//getters and setters
}
此响应对象封装了T
类型的结果对象。
在客户端,我使用添加了RestTemplate
的{{1}}。
我从服务中得到GsonHttpMessageConverter
我使用运行时ResponseEntity
处理通用响应,如下所示:
Type
只要我的public class OperationalDataRestClient<REQ,RESULT_TYPE> {
public OperationalDataResponse<RESULT_TYPE> getOperationalData(String resourcePath, Map<String, Object> urlVariables, Class<RESULT_TYPE> resultType) {
//code to invoke service and get data goes here
String responseString = responseEntity.getBody();
response = GsonHelper.getInstance().fromJson(responseString, getType(OperationalDataResponse.class, resultType));
}
Type getType(final Class<?> rawClass, final Class<?> parameter) {
return new ParameterizedType() {
@Override
public Type[] getActualTypeArguments() {
return new Type[] { parameter };
}
@Override
public Type getRawType() {
return rawClass;
}
@Override
public Type getOwnerType() {
return null;
}
};
}
}
是非集合类,这就像魅力一样。
因此,这可以从调用者代码中发挥作用:
resultType
但是,如果我的getOperationalData(someResourcePath, someUrlVariables, MyNonGenericClass.class)
是一个集合(例如,resultType
或List<String>
)
然后我不知道如何从调用者代码传递List<MyNonGenericClass>
类。
例如,来自来电者代码,
resultType
或
getOperationalData(someResourcePath, someUrlVariables, List.class)
抛出编译错误。
我也试过传递getOperationalData(someResourcePath, someUrlVariables, List<MyNonGenericClass>.class)
,但这也不起作用。
任何建议如何从调用者代码传递通用集合作为ArrayList.class
(换句话说,作为示例,我如何传递resultType
或{{1}的类对象来自来电者代码?)
答案 0 :(得分:0)
如果您知道ResultType将作为列表出现,那么它会明显失败,就像您说的编译问题一样。为什么?因为您尝试在方法只接受单个值时发送List。为了解决该问题,您必须将方法参数更改为以下
public OperationalDataResponse<RESULT_TYPE> getOperationalData(String resourcePath, Map<String, Object> urlVariables, List<Class<RESULT_TYPE>> resultType){
....
}
你必须对getType()方法进行一些修改,然后循环它,然后将每个类值传递给getType方法,如此
for(MyNonGenericClass myClass:mylist){
getType(OperationalDataResponse.class, myClass.getClass());
}