【问题标题】:Java - Exposing a DAO Class that implements an interface as a Web ServiceJava - 公开一个将接口实现为 Web 服务的 DAO 类
【发布时间】:2013-11-19 03:45:10
【问题描述】:

我有这个项目,我想将 DAO 类公开为 Web 服务。不幸的是,似乎无法公开实现接口(或扩展抽象类)的类。 要求是 Axis 1.4Tomcat 7 - 我正在使用 IDE Eclipse

这里有点界面IDAO.java

public interface IDAO<T> {

    public final static Connection connect = SQLiteJDBC.getInstance();

    public T find(long id);

    public Product[] findByName(String search);
}

然后是来自ProductDAO.Java 的一些代码(这是作为 Web 服务公开的类

public class ProductDAO implements IDAO<Product> {
    @Override
    public Product find(long id) {
        // TODO Auto-generated method stub
        // DB Query 
        return prod;
    }

    @Override   
    public Product[] findByName(String search) {
        // Database action
        // Retourne l'arraylist converti en array   
        return prods;
    }

}

然后我使用 Eclipse 内置的自底向上向导来生成 Web 服务。

但是当我在浏览器或 Eclipse Web 服务资源管理器中尝试公开的方法时,我得到了这个错误。

The AXIS engine could not find a target service to invoke! targetService is ProductDAO

我尝试将IDAO 转换为抽象类。但是生成过程不会通过。 有人有过类似的情况吗?感谢您的帮助。

【问题讨论】:

  • 验证 URLMapper 没有丢失...
  • 对不起,尽管我知道 Java - Web 服务对我来说是新的。作为一个学习项目,请随时提出更好的设计,更好的做事方式......

标签: java eclipse web-services axis dao


【解决方案1】:

此答案中有 2 分:

1) 看看这个问题:exception: The AXIS engine could not find a target service to invoke! targetService is SecurityDepositServiceImpl

Axis 似乎希望在 URL 中找到服务名称,仔细注意键入对服务名称区分大小写的 URL,并注意链接答案中可能出现的尾部斜杠。

2) DAO 模式中有一个哲学问题:当您的应用程序访问外部数据源时,您使用 DAO 模式,这可以是一切:配置文件、数据库、外部服务...... 但这种说法是错误的:

“我想将 DAO 类公开为 Web 服务”

这不是使用 DAO 的正确方法:您不公开 DAO,您使用 DAO 接口访问外部数据

无论如何,如果您的应用程序是外部 Web 服务的客户端,那么使用 DAO 模式提供一个接口以允许您的业务对象访问该数据源(该 Web 服务)。

我建议您阅读 Oracle 文档中有关 DAO 的非常有趣的内容:http://www.oracle.com/technetwork/java/dataaccessobject-138824.html

编辑:

为了澄清这是我期待的 Java Axis 服务的一个示例

public class ProductService {
  public int create(String name) {
    return new ProductDAO().add(name);
  }

  public List<Product> read() {
    return new ProductDAO().getAll();
  }

  //... and so on for the CRUD operations
}

我不知道如何扩展答案了,请记住:

  • 您的 DAO 访问数据源(在本例中为您的数据库)。
  • Web 服务公开一个方法。
  • DAO 是一回事,Web 服务是另一回事。
  • 您可以在 Web 方法中清楚地调用您的 DAO。

【讨论】:

  • 我已经看到你链接到的另一个问题,但它并没有解决我的问题。实际上,这是服务器端:我的 DAO 使用数据库中的数据工作 (CRUD) 并将其传递给应用程序层。现在我想公开这个,我想我可以直接公开 DAO 类,因为 web 服务将执行相同的 CRUD 操作......
  • 但这是一个设计错误:你正确地使用你的 DAO 从 DB 获取数据,但是将它绑定到你的 WS 接口是错误的!事实上,您的 WS 接口 NOT 是 DAO 接口。因此,只需在您要公开的方法中调用 DAO CRUD 操作即可。
  • 感谢您的努力!但是你能更明确一点吗?在这个As a matter of fact your WS interface is NOT a DAO interface。我的问题是我无法从 WS 客户端调用 ProductDAO 方法我收到错误 The AXIS engine could not find a target service to invoke! targetService is ProductDAO
  • 如果您的应用程序是客户端,那么您的 WS 客户端的 DAO 可能 看起来像 WS 服务器的 DAO,但它们并不相同事情:第一个处理您的 Web 服务,第二个(ProductDAO)处理数据库。我再说一遍,直接将 DAO 方法作为服务公开是一个糟糕的设计,因为您严格绑定了两个应该分开的东西(访问 DB 的 DAO 和您的 WS 方法)。
  • 因此,如果我遵循,您建议在 DAO 和 Web 服务之间添加另一层。我对吗?你能推荐一条路吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多