2013-04-25 60 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