我在java中构建了一个模块化项目,共有5层。
第1层 - Bean(类)
第二层 - DaoDB(类)
第3层 - Dao(接口) - 它是一个明亮的(从外观到DaoDB)
第4层 - 外观(类) - 业务逻辑
和
第5层 - 使用JAX-RS和JSON的动态Web项目
我在第5层登录方法有问题。
@Path("/web-project")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class AdminService{
private Company companyBean;
private AdminFacade getAdminFacade(HttpServletRequest req) {
AdminFacade facade = ((AdminFacade) req.getSession().getAttribute("adminFacade"));
return facade;
}
@Path("/login")
@POST
public Message adminLogin(LogInBean lgb, @Context HttpServletRequest req) throws UserSystemException, ClassNotFoundException {
// Class.forName("org.apache.derby.jdbc.ClientDriver");
CouponClientFacade facade=CouponSystem.getInstance().login(lgb.getLogin(), lgb.getPassword(), "Admin");
HttpSession session = req.getSession(true);
session.setAttribute("adminFacade", facade);
return new Message("logged in successfully as admin");
}
.....
.....
数据库的问题 - ClientDriver。当我尝试添加新公司时,我得到了SQLException。如果我没有使用Class.forName("org.apache.derby.jdbc.ClientDriver");
并且当我尝试运行其他(CRUD)方法时 - 例如
@Path("/createnewcompany")
@POST
public Message addCompany(Company cb, @Context HttpServletRequest req) throws UserSystemException {
getAdminFacade(req).createCompany(cb);
return new Message("created a new company: " + cb.getCompName());
}
我得到一个例外但是,如果我去façade层并尝试运行所有CRUD方法,他们的工作正常。
为什么JAX-RS不能使用第一层写入的客户端驱动程序?
当我在客户端登录方法上明确地写了驱动程序的实现 - Class.forName("org.apache.derby.jdbc.ClientDriver");
时,JAX-RS和JSON的工作正常。
感谢您的帮助。
答案 0 :(得分:0)
所以你的外观是单身和有状态的,你的网络层是无状态的和请求范围的。
因此,在每个请求中,它都是一个新线程,并且驱动程序可能是线程绑定的。 这是oracle的情况:
将连接与线程相关联
要将连接与线程关联,请将“与线程关联”属性设置为true。默认值为false。 true设置允许将连接保存为调用线程中的ThreadLocal。仅当调用线程终止或调用线程未使用且池已用完连接时才会回收连接。如果设置为false,则每次线程需要连接时,线程必须从池中获取连接。
顺便说一下,使用分层架构,你的webtier不应该对数据库做任何事情,对吧? (它应该只进行验证和输入/输出转换。实际的业务逻辑应该调用数据库层来进行数据库操作)