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

时间:2014-11-17 15:29:03

标签: java jsp java-ee servlets ejb

我是Servlets的新手,我尝试为数据库访问创建一个Helper类。我创建了这个简单的类,它或多或少都有效。我可以在“startUp”方法中没有任何问题地访问数据库,但是当我访问Servlets中的方法时,“dataSource”始终为null。 我做错了什么?

我正在使用带有Glassfish 4.1和Java 7的Netbeans。

Database.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" /> 
....

1 个答案:

答案 0 :(得分:0)

通过使用useBean,您实例化新的Database对象,而不是注入它,然后@Resource未被处理,这就是dataSource为空的原因。

正如其他人所建议的那样,你不应该直接在jsp中使用EJB,但如果你需要,则需要:

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