Java—将实现接口的DAO类公开为Web服务

Java—将实现接口的DAO类公开为Web服务,java,eclipse,web-services,axis,dao,Java,Eclipse,Web Services,Axis,Dao,我有一个项目,希望将DAO类作为web服务公开。不幸的是,实现接口(或扩展抽象类)的类似乎无法公开。 要求是轴1.4、Tomcat7,我使用的是IDEEclipse 下面是一些接口IDAO.java public interface IDAO<T> { public final static Connection connect = SQLiteJDBC.getInstance(); public T find(long id); public Prod

我有一个项目,希望将DAO类作为web服务公开。不幸的是,实现接口(或扩展抽象类)的类似乎无法公开。 要求是轴1.4、Tomcat7,我使用的是IDEEclipse

下面是一些接口
IDAO.java

public interface IDAO<T> {

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

    public T find(long id);

    public Product[] findByName(String search);
}
然后我使用Eclipse内置的自底向上向导来生成web服务

但是,当我在浏览器或EclipseWebServiceExplorer中尝试公开的方法时,我得到了这个错误

AXIS引擎找不到要调用的目标服务!targetService是ProductDAO

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

此答案中有两点:

1) 看看这个问题:

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

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

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

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

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

我建议您阅读Oracle文档中有关DAO的非常有趣的内容:

编辑:

为了澄清这一点,我希望这是一个Java Axis服务的示例

公共类产品服务{
公共int创建(字符串名称){
返回新产品dao().add(名称);
}
公共列表读取(){
返回新产品dao().getAll();
}
//…等等,用于CRUD操作
}
我不知道如何扩展答案,请记住:

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

确认URLMapper没有丢失……对不起,伙计们,尽管我知道Java-Web服务对我来说是新的。作为一个学习项目,请随意提出更好的设计,更好的做事方式……我已经看到了你提到的另一个问题,但它并没有解决我的问题。实际上,这是服务器端:我的DAO(CRUD)处理来自数据库的数据并将其传递给应用层。既然我想公开它,我想我可以直接公开DAO类,因为webservice将执行相同的CRUD操作……但这是一个设计错误:您正确地使用DAO从DB获取数据,但将其绑定到WS接口是错误的!事实上,您的WS接口不是DAO接口。因此,只需在您将要公开的方法中调用DAO CRUD操作即可。感谢您的努力!但你能说得更清楚些吗?实际上,在这个
上,您的WS接口不是DAO接口。我的问题是,我无法从WS-client调用ProductDAO方法,我得到错误
,AXIS引擎找不到要调用的目标服务!targetService是ProductDAO
如果您的应用程序是客户端,那么您的WS客户端的DAO可能看起来像WS服务器的DAO,但它们不是同一件事:第一个处理Web服务,第二个(ProductDAO)处理数据库。我重复一遍,直接将DAO方法作为服务公开是一个糟糕的设计,因为您严格绑定了两个应该分开的东西(DAO访问DB和您的WS方法)。因此,如果我遵循,您建议在DAO和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;
    }

}
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
}