2013-04-25 59 views
0

我工作的一个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应用程序占用。

回答

0

如果您使用的是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(); 
} 
+0

我可能会将该代码放入适配器类(例如:OrderLegacyServiceAdapter)中,以便如果需要在另一个方法上再次调用它时,我不必重复自己 – gerrytan 2013-04-25 05:50:57