我不确定我想要做的事情是不可能的,或者也许是在长周末之前的星期五,我的大脑已经检查过了。我尝试了几种方法但似乎没有什么能让我得到我想要的东西。
背景
我编写了一个小的包装器框架,它使用Apache HTTP Commons lib将我的门户应用程序与外部REST API连接起来。我创建了一个如下所示的层次结构(对于请求和响应 - 客户端是我在这里用来抽象我的实际最终客户端的术语)。
ClientRequest (abstract)
BaseClientRequest (abstract)
RequestA
RequestB
...
RequestN
我想做的是用同样的回应镜像请求 -
ClientResponse (abstract)
BaseClientResponse (abstract)
ResponseA
ResponseB
...
ResponseN
到目前为止一切顺利。问题临近。我创建了一个名为ClientServiceUtil
的实用程序类
实现了一个名为post()
的方法,该方法接受ClientRequest
参数,同样返回一个
ClientResponse
类型。所有服务调用都使用相同的逻辑。我创建的模型甚至使用了泛型
参数的键值对技术上我只能使用基本级别的类,但它是
早期阶段,我确信逻辑将开始因服务而异 - 因此具体实现。
在我的post方法中,我运行逻辑,作为流程的一部分,我创建了一个存储的ClientResponse
对象
结果并返回它。现在问题。
我有一个portlet。 portlet创建一个RequestA
对象并使用它调用ClientServiceUtil
。它需要ResponseA
响应,但它返回的是ClientResponse
,因此我有一个分配错误。
ResponseA response = ClientServiceUtil.post( new RequestA() );
...如果我尝试使用强制转换修复此问题,那么显然,我最终会遇到运行时强制转换异常
ResponseA response = (ResponseA)clientServiceUtil.post( new RequestA() );
现在我开始认为重复每个请求的服务调用逻辑(在我的post方法中找到)或将其拆分为部分调用等是我唯一的选择。我真的不想这样做,所以我希望那里的其他人对我有所了解。
答案 0 :(得分:0)
您可以使用泛型,例如:
public <T, R extends ClientResponse<T>> R post(ClientRequest<T> request) {
...
}
答案 1 :(得分:0)
我建议将请求用作一种工厂来创建关联的响应。例如:
public interface ClientRequest {
...
public ClientResponse createResponseInstance();
...
}
然后,在ClientServiceUtil中,
public ClientResponse post(ClientRequest req) {
...send the request...
ClientResponse resp = req.createResponseInstance();
...initialize values in resp...
return resp;
}
所以如果你有以下内容:
public class RequestA extends BaseClientRequest {
...
public ClientResponse createResponseInstance() {
return new ResponseA();
}
...
}
然后post()
会在ResponseA
作为参数传递时返回RequestA
个对象。
这允许您安全地将响应转换为ResponseA。