首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在bluemix上使用java注释初始化数据源

无法在bluemix上使用java注释初始化数据源
EN

Stack Overflow用户
提问于 2015-11-17 10:40:48
回答 2查看 774关注 0票数 3

我有一个运行在bluemix云服务器上的java应用程序,我最初是在tomcat服务器上本地开发的,然后决定迁移到云。随处可见的选项是使用after和sqldb服务,经过一些限制之后,我在自己的bluemix帐户上安装了名为sql绑定的SQL数据库,将其绑定到我的java应用程序中。

运行以下代码时会遇到此问题:

代码语言:javascript
复制
@WebServlet({ "/LoginServlet", "/" })
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

private Connection conn;

@Resource(lookup="jdbc/SQL-RCT")
private DataSource myDataSource;

/**
 * @see HttpServlet#HttpServlet()
 */
public LoginServlet() {
    super();
    try {
        if(myDataSource == null){
            throw new Exception("no data source");
        }
        conn = myDataSource.getConnection();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

当我试图加载servlet时,我得到一个错误,我的init函数中有一个空指针异常,我很快就能够缩小到我的myDataSource对象为null。

我已经检查了server.xml,我正在使用正确的名称进行查找,但是查找似乎不起作用,任何帮助都将不胜感激。

the server.xml

代码语言:javascript
复制
<server>
<featureManager>
    <feature>beanValidation-1.1</feature>
    <feature>cdi-1.2</feature>
    <feature>ejbLite-3.2</feature>
    <feature>el-3.0</feature>
    <feature>jaxrs-2.0</feature>
    <feature>jdbc-4.1</feature>
    <feature>jndi-1.0</feature>
    <feature>jpa-2.1</feature>
    <feature>jsf-2.2</feature>
    <feature>jsonp-1.0</feature>
    <feature>jsp-2.3</feature>
    <feature>managedBeans-1.0</feature>
    <feature>servlet-3.1</feature>
    <feature>websocket-1.1</feature>
    <feature>icap:managementConnector-1.0</feature>
    <feature>appstate-1.0</feature>
    <feature>cloudAutowiring-1.0</feature>
</featureManager>
<application name='myapp' location='myapp.war' type='war' context-root='/'/>
<cdi12 enableImplicitBeanArchives='false'/>
<httpEndpoint id='defaultHttpEndpoint' host='*' httpPort='${port}'/>
<webContainer trustHostHeaderPort='true' extractHostHeaderPort='true'/>
<include location='runtime-vars.xml'/>
<logging logDirectory='${application.log.dir}' consoleLogLevel='INFO'/>
<httpDispatcher enableWelcomePage='false'/>
<applicationMonitor dropinsEnabled='false' updateTrigger='mbean'/>
<config updateTrigger='mbean'/>
<appstate appName='myapp' markerPath='${home}/../.liberty.state'/>
<dataSource id='db2-SQL-RCT' jdbcDriverRef='db2-driver' jndiName='jdbc/SQL-RCT' statementCacheSize='30' transactional='true'>
    <properties.db2.jcc id='db2-SQL-RCT-props' databaseName='${cloud.services.SQL-RCT.connection.db}' user='${cloud.services.SQL-RCT.connection.username}' password='${cloud.services.SQL-RCT.connection.password}' portNumber='${cloud.services.SQL-RCT.connection.port}' serverName='${cloud.services.SQL-RCT.connection.host}'/>
</dataSource>
<jdbcDriver id='db2-driver' libraryRef='db2-library'/>
<library id='db2-library'>
    <fileset id='db2-fileset' dir='${server.config.dir}/lib' includes='db2jcc4.jar db2jcc_license_cu.jar'/>
</library>
</server>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-17 14:48:49

注入的资源在servlet构造函数中不可用,因为在servlet实例完全初始化之后才会注入资源。

相反,请重写servlet init()方法,并在其中获取连接。这个生命周期方法将给出与您当前试图在servlet构造函数中创建连接的方式相似的生命周期行为。

示例代码:

代码语言:javascript
复制
@WebServlet({ "/LoginServlet", "/" })
public class LoginServlet extends HttpServlet 
{
    private static final long serialVersionUID = 1L;

    private Connection conn;

    @Resource(lookup="jdbc/SQL-RCT")
    private DataSource myDataSource;

    @Override
    public void init() throws ServletException {
        super.init();
        try {
            conn = myDataSource.getConnection();
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }
}

作为附带说明:

因为scope池连接,所以没有必要在类作用域中存储连接。如果在需要连接时获得连接,并在使用完连接后关闭连接,则不应看到任何性能差异。如果您想要在servlet init代码中获得连接,作为一种热切获取连接的方式,这是很好的,但它会影响servlet加载时间。

票数 2
EN

Stack Overflow用户

发布于 2015-11-17 11:24:27

在大多数容器中,@Resource注释的命名约定如下:

代码语言:javascript
复制
@Resource(name = "java:/comp/env/jdbc/SQL-RCT")
    private DataSource myDataSource;

在这个答案上找到了它:

JNDI @Resource annotation

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33754849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档