使用和扩展带有注入数据源的 JOOQ 生成的 DAO?

问题描述

我是 JOOQ 的新手...以下代码似乎适用于 WildFly 22,但我不确定这是否是最好的做事方式。将 WF 数据源注入 JOOQ DAO(我的扩展程序)的首选方法是什么?有没有办法避免执行“.get()”。在下面的服务中,只留下 @Resource(...) 等与 MyCompanyDAO 相关的连接在内部处理?

换句话说:companyDAO.get().fetchOneById(id) vs. companyDAO.fetchOneById(id)

@Stateless
public class CompanyService extends DefaultCompanyService {

    @Inject
    private MyCompanyDAO companyDAO;

    public Company find(Integer id) {
        return companyDAO.get().fetchOneById(id);
    }
}

@Stateless
public class MyCompanyDAO extends CompanyDao {

    @Inject
    private MyConnectionProvider cp;

    public CompanyDAO get() { // since cannot use @Resource in dao constructor
        this.configuration().set(cp).set(sqlDialect.POSTGRES);
        return this;
    }

    // custom code here
}

public class CompanyDao extends DAOImpl<CompanyRecord,tables.pojos.Company,Integer> {
    // jooq generated code here
}

@Stateless
@LocalBean
public class MyConnectionProvider implements ConnectionProvider {

    @Resource(lookup = "java:/MyDS")
    private DataSource dataSource;

    @Override
    public Connection acquire() throws DataAccessException {
        try {
            return dataSource.getConnection();
        } catch (sqlException e) {
            throw new DataAccessException("Could not acquire connection.",e);
        }
    }

    @Override
    public void release(Connection connection) throws DataAccessException {
        try {
            connection.close();
        } catch (sqlException e) {
            throw new DataAccessException("Could not release connection.",e);
        }
    }
}

解决方法

MyCompanyDAO 的初始化逻辑放在 @PostConstruct 方法中。

@PostConstruct
public void init() { 
    this.configuration().set(cp).set(SQLDialect.POSTGRES);
}

这样,你就不需要调用 get:

@Inject
private MyCompanyDAO companyDAO;

public Company find(Integer id) {
    return companyDAO.fetchOneById(id);
}
,

改用构造函数注入怎么样?生成的 DAO 类提供了一个构造函数,该构造函数专门为此接受 Configuration

@Stateless
public class MyCompanyDAO extends CompanyDao {

    @Inject
    public MyCompanyDAO (Configuration configuration) {
        super(configuration);
    }
}

如果由于某种原因您无法注入整个配置(我建议这样做),您仍然可以注入 ConnectionProvider

@Stateless
public class MyCompanyDAO extends CompanyDao {

    @Inject
    public MyCompanyDAO (MyConnectionProvider cp) {
        super(DSL.using(cp,SQLDialect.POSTGRES));
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...