从Spring WebService调用同一服务中的多个方法

时间:2013-04-25 04:06:10

标签: spring design-patterns

我正在开发一个Spring 2.0 WebService,它需要根据WebService Request的一个属性调用遗留服务的多个方法中的一个。我不想在@endpoint中编写if / else检查来实现这一点。我应该使用什么样的设计模式来使其在未来更加清洁和可维护,以便在必须支持新的订单类型(请参阅下面的示例代码)时,我不需要添加其他块。

@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来实现Factory模式,如果我有多个同一服务的实现,比如CreateOrderService,ModifyOrderService,ReplaceOrderService等。但在这种情况下,我必须调用同一服务的多个方法。我目前无法更改旧服务接口,因为它已被另一个Web应用程序使用。

1 个答案:

答案 0 :(得分: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();
}