Java Fa和xE7;ade-接受对象实例还是单个参数?

Java Fa和xE7;ade-接受对象实例还是单个参数?,java,web-services,Java,Web Services,我正在创建一个无状态会话bean(façade),它将用于“管理”一个特定实体,我们称之为产品。将有添加新产品、更新现有产品、获取产品等方法(我使用Hibernate进行持久化,因此我有一个façade将用于DB访问的“ProductDbManager”bean) 这个bean将作为web服务公开,因此可以从web界面和简单的桌面应用程序调用它 我的问题是,对于像AddProduct这样的方法来说,接受产品实例,还是接受诸如“名称”、“描述”、“价格”等单个参数,是最佳做法 一个产品最初可能只使

我正在创建一个无状态会话bean(façade),它将用于“管理”一个特定实体,我们称之为产品。将有添加新产品、更新现有产品、获取产品等方法(我使用Hibernate进行持久化,因此我有一个façade将用于DB访问的“ProductDbManager”bean)

这个bean将作为web服务公开,因此可以从web界面和简单的桌面应用程序调用它

我的问题是,对于像AddProduct这样的方法来说,接受产品实例,还是接受诸如“名称”、“描述”、“价格”等单个参数,是最佳做法

一个产品最初可能只使用一个“名称”,或者“名称”和“描述”,或者设置了所有属性,等等。从这个角度来看,只接受产品实例会更简单(就创建外观而言),这样客户就可以简单地创建一个新产品,设置任何可用的属性,然后传递它


使用替代选项,我需要创建相当多的AddProduct重载,以接受不同的参数。然而,为了尽可能灵活,让立面使用者的生活更轻松,这是否更可取?这两个选项都可用吗?

我更喜欢直接添加一个
产品
实例。如果您担心客户机代码会创建
产品
实例,那么可以提供一个
产品工厂
,该工厂可以提供所有重载方法,只设置
产品的一部分

我更喜欢web服务方法来接收表示相关数据项的对象

有时,对于非平凡的方法,达到以下程度:

DoActionResponse doAction(DoActionRequest request);
作为我的web服务方法。然后,web服务实现将执行输入验证(与servlet在将表单输入传递到代码核心之前验证表单输入的方式相同),并将必要的数据映射到核心代码所期望的内容。为什么要进行数据映射?我发现,拥有一个独立于内部核心系统数据模型的web服务数据模型,允许我根据需要更新内部模型,而无需更改外部模型,从而影响客户机

为了你,我会的

boolean addProduct(Product toAdd);
为了防止您在产品中添加更多字段,您不需要更改web服务接口,这将最终导致五个人不得不在三年后更改代码,因为他们的系统依赖于您的web服务

<>我也会考虑一些身份验证,以便只有管理员用户才能操作数据库。SOAP有这样的功能,或者您可以:

boolean addProduct(Product toAdd, Authentication auth);


但是,向客户机返回错误,而不仅仅是真/假,又如何呢?当然有,但级别很低。这就是为什么我有时会有响应对象,其中对象中的一个字段是一组错误对象(错误代码、错误消息等)。

谢谢。关于独立数据模型的有趣之处——由于我的内部实体是JPA注释的POJO,因此客户端直接使用这些实体似乎不合适(例如,在更改数据库结构等的情况下)。是的,我们不想公开的对象中的数据库元数据(ID和时间戳)也有类似的问题。随着时间的推移,我们发现分离模型会带来更好的可靠性(对于多个客户机)和更易于维护的代码。对于复杂的模型来说,这当然是一件痛苦的事情,尤其是当它们实际上是相同的结构时。我唯一担心的是可能会违反DRY原则,尽管我认为可能会以某种方式从JPA实体自动生成公开的类,忽略内在属性。总比违反“不要暴露自己”的原则要好,因为你会把太多的内心暴露给外界。当然,这取决于您的web服务实现。对于Axis,我们还必须改变使用平面阵列等,这使得不同的模型成为更好的选择。不同web服务实现之间的大量不兼容性是一个真正的难题,而且目前Axis甚至不能自己工作,因为它不能使用java2wsdl枚举(wsdl生成器中的一个问题)。难怪人们首先提倡WSDL。
AuthToken login(String username, String password);
boolean addProduct(Product toAdd, AuthToken token); // token is a string really. like a session id