定义Web服务接口(继承/重载)的最佳/标准方法是什么?

时间:2011-06-15 19:12:15

标签: java web-services axis

定义Web服务接口的最佳/标准方法是什么?

例如,

我有两个级别的Car和Bus,它们都扩展了Vehicle。

如果我想公开汽车和公共汽车的创建方法,我有以下选项 -

  1. public void create(Vehicle v);
  2. public void create(String type,Vehicle v);
  3. public void create(Car c);和public void create(Bus b);
  4. public void createCar(Vehicle v);和public void createBus(Vehicle v);
  5. public void createCar(Car c);和public void createBus(Bus b);
  6. EDIT ---------------------------------

    我主要关注的是上述5个选项,Web服务API的标准方式是什么。 java编码的标准可能不是Web服务的标准。

3 个答案:

答案 0 :(得分:2)

第一个似乎是您可以使用的最通用的一个,您只需在CarBus

中覆盖它

答案 1 :(得分:2)

如果您对标准方式感兴趣,那么这些都不是。
Web服务不支持操作重载,并且在WS BP配置文件中禁止使用 WS BP

4.5.3 Distinctive Operations

Operation name overloading in a wsdl:portType is disallowed by the Profile. 

这实际上是有意义的,因为消息模式(doc / lit)期望操作名称作为消息有效负载的根来进行调度。
此外,您正在谈论OO概念,但Web服务标准是指集成技术(不绑定到特定语言或平台)。
在任何情况下,如果你希望这样做,你可以通过注释和你的情况下的tweeking实现重载,恕我直言,我认为最好的选择是2,以便消费者知道如何转发它。

答案 2 :(得分:1)

首先,您的方法称为create,因此按照惯例应该是一种工厂方法,因此shouild 返回实例的Vehicle。您的方法看起来更像init,因为它们接收车辆,汽车,公共汽车的实例。

所以,我建议你修改你的签名,如

Vehicle create(*some arguments*)

现在关于reurn类型。我建议你使用基于泛型的定义,如

<V extends Vehicle> V create()

可以在不转换为特定Vehicle子类的情况下调用此方法。

关于arguemtns。我相信你可以使用

  1. 字符串类型(如您所建议)
  2. 班级类型
  3. 定义特殊的enum Vehicles {Car,Bus,Bike}并使用它。
  4. 或者你可以(如你的建议)为每种类型的车辆创建几种工厂方法,例如createCarcreateBus,但我不喜欢这种方法,因为每次添加新类型的车辆时都需要添加这种方法。