呼叫在同一服务的多个方法从春天的WebService
问题描述:
我工作的一个Spring 2.0的WebService,这需要调用一个传统服务的多种方法,基于WebService的请求的属性之一中的一个。我不想在我的@endpoint中写入if/else检查来实现此目的。我应该使用什么类型的设计模式来使其更加清洁和可维护,以便在需要支持新订单类型(请参阅下面的示例代码)时,我不需要添加其他的其他块。呼叫在同一服务的多个方法从春天的WebService
@Endpoint
public class OrderServiceEndPoint {
@Autowired
private OrderLegacyService orderService;
@PayloadRoot
public @ResponsePayload OrderResponse processRequest(
@RequestPayload OrderRequest request) {
if ("Create".equals(request.type)) {
return orderService.createOrder(request);
} else if ("Modify".equals(request.type)) {
return orderService.modifyOrder(request);
} else if ("Return".equals(request.type)) {
return orderService.returnOrder(request);
} else if ("Replace".equals(request.type)) {
return orderService.replaceOrder(request);
} else {
throw new RequestNotSupportedException();
}
}
我已经使用org.springframework.beans.factory.config.ServiceLocatorFactoryBean实现在那里我有一个以上的实施同样的服务,就像一个CreateOrderService,ModifyOrderService,ReplaceOrderService等,但在案件工厂模式在这种情况下,我必须调用同一服务的多个方法。我现在无法更改旧版服务接口,因为它已被其他Web应用程序占用。
答
如果您使用的是Java 7(可能并非如此),Java 7的支持在字符串转换。所以,你可以写:
switch(request.type) {
case "Create": return orderService.createOrder(request);
case "Modify": return orderService.modifyOrder(request);
case "Return": return orderService.returnOrder(request);
case "Replace": return orderService.replaceOrder(request);
default: throw new RequestNotSupportedException();
}
如果您使用的是Java 6或以前的版本中,创建一个枚举类型:
public enum RequestType {
CREATE,MODIFY,RETURN,REPLACE;
}
的,你可以在代码中使用下列内容:
switch (RequestType.valueOf(requestType.toUpperCase())) {
case CREATE: return orderService.createOrder(request);
case MODIFY: return orderService.modifyOrder(request);
case RETURN: return orderService.returnOrder(request);
case REPLACE: return orderService.replaceOrder(request);
default: throw new RequestNotSupportedException();
}
我可能会将该代码放入适配器类(例如:OrderLegacyServiceAdapter)中,以便如果需要在另一个方法上再次调用它时,我不必重复自己 – gerrytan 2013-04-25 05:50:57