【问题标题】:JAVA EE / RESTful - JAX-RS and JSON throw SQLException for Class.forName(...ClientDriver)JAVA EE / RESTful - JAX-RS 和 JSON 为 Class.forName(...ClientDriver) 抛出 SQLException
【发布时间】:2017-01-16 20:48:15
【问题描述】:

我在 java 中构建了一个模块化项目,有 5 层。
第一层 - 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());
}

我遇到了一个异常,但是,如果我转到外观层并尝试运行所有 CRUD 方法,它们就可以正常工作。

为什么 JAX-RS 不能与写在第一层的客户端驱动程序一起工作?

当我在客户端登录方法上明确编写驱动程序的实现时,JAX-RS 和 JSON 工作正常 - 仅限 Class.forName("org.apache.derby.jdbc.ClientDriver");

感谢您的帮助。

【问题讨论】:

    标签: java json jdbc jax-rs restful-authentication


    【解决方案1】:

    所以你的外观是单例和有状态的,你的 web 层是无状态的和请求范围的。

    所以在每个请求中,它都是一个新线程,并且驱动程序可能是线程绑定的。 oracle就是这种情况:

    将连接与线程关联

    要将连接与线程相关联,请将 Associate With Thread 属性设置为 true。默认值为假。 true 设置允许在调用线程中将连接保存为 ThreadLocal。仅当调用线程死亡或调用线程未在使用并且池已用完连接时,才会回收连接。如果设置为false,则线程每次需要连接时都必须从池中获取连接。

    顺便说一句,对于您的分层架构,您的 webtier 不应该对数据库做任何事情,对吧? (它应该只做验证和输入/输出翻译。实际的业务逻辑应该调用数据库层来做数据库操作)

    【讨论】:

    • 是的,确实如此。
    • 如果我从 // Class.forName("org.apache.derby.jdbc.ClientDriver");该系统运行良好。我认为在我的 web 模块中不要与 ClientDriver 一起使用的好方法。如果我评论它,那么我有一个例外。
    猜你喜欢
    • 1970-01-01
    • 2017-07-18
    • 2017-09-08
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多