Java—将实现接口的DAO类公开为Web服务
我有一个项目,希望将DAO类作为web服务公开。不幸的是,实现接口(或扩展抽象类)的类似乎无法公开。 要求是轴1.4、Tomcat7,我使用的是IDEEclipse 下面是一些接口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
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
上,您的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
}