@Resource运行时为 null,但在启动时不为 null



我是 Servlet 的新手,我试图创建一个用于数据库访问的帮助程序类。我创建了这个简单的类,它或多或少有效。我可以在"startUp"方法中毫无问题地访问数据库,但是当我访问Servlets中的方法时,"数据源"总是为空。我做错了什么?

我将Netbeans与Glassfish 4.1和Java 7一起使用。

数据库.class

@Singleton
@Startup
public class Database {
    @Resource( lookup = "jdbc/resBookStoreMySql" )
    private DataSource dataSource;
    @PostConstruct
    private void startUp() {
        System.err.println("=====================");
        System.err.println(this.dataSource == null); //false
    }
    @Lock( LockType.READ )
    public boolean isPasswordCorrect(String username, String password) {
        boolean isPasswordCorrect = false;
        System.err.println(this.dataSource == null); //true
        // . . . 
        return isPasswordCorrect;
    }
    @Lock(LockType.READ)
    public List<Book> getBooks() {
        List<Book> books = new ArrayList<>();
        System.err.println(this.dataSource == null); //true
        // . . . 
    return books;
    }
}

SomeServlet.jsp:

....
<jsp:useBean id="db" class="at.laubi.servlet.data.Database" scope="page" /> 
....
通过使用

useBean,您正在实例化新的Database对象,而不是注入它,然后不处理@Resource,这就是dataSource为空的原因。

正如其他人建议的那样,您不应该直接在 jsp 中使用 EJB,但是如果您必须这样做,则需要:

  • @Named("database")添加到您的豆子中
  • 例如,在 JSP 中使用 #{database.books} 来获取书籍列表

最新更新