2

我已经在管理控制面板中使用 JNDI 名称设置了 jdbc 资源:jdbc/shop,我用“Ping 连接”检查它并且它成功了

这是bean代码摘录:

import javax.annotation.Resource;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import javax.sql.DataSource;

@Named
@RequestScoped
public class IndexBean {

    // from glassfish config:
    // <jdbc-connection-pool datasource-classname="org.postgresql.ds.PGSimpleDataSource" res-type="javax.sql.DataSource" name="ShopPool"
    // <jdbc-resource pool-name="ShopPool" jndi-name="jdbc/shop"

    @Resource(name="jdbc/shop")
    private DataSource db;

    public IndexBean() throws SQLException {
        if(db == null) {
            System.err.println("db is null ?");
        }
    }

所以你猜到了,我经常得到“db is null?” 日志中的条目。有什么建议可以调试/修复这个问题吗?据我了解,JNDI 名称也是 100% 正确的,因为更改它会导致 jndi 错误。

4

1 回答 1

4

您的资源在 bean 的构造函数中不可用,因为注入发生构造之后。

使用带有注释的初始化方法@PostConstruct来访问您的资源:

import javax.annotation.PostConstruct;
..
@PostConstruct
public void init() {
   if(db == null) {
      System.err.println("db is null ?");
   }
}
于 2012-05-16T07:08:30.983 回答