Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用bluemix上的java注释初始化数据源_Java_Jdbc_Db2_Ibm Cloud_Websphere Liberty - Fatal编程技术网

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

无法使用bluemix上的java注释初始化数据源,java,jdbc,db2,ibm-cloud,websphere-liberty,Java,Jdbc,Db2,Ibm Cloud,Websphere Liberty,我有一个java应用程序在bluemix云服务器上运行,我最初在tomcat服务器上本地开发它,然后决定迁移到云。建议无处不在的选项是使用liberty和sqldb服务,经过一些修改后,我在我的bluemix帐户上安装了名为sql-RCT的sql数据库,并将其作为服务绑定到我的java应用程序 运行以下代码时遇到问题: @WebServlet({ "/LoginServlet", "/" }) public class LoginServlet extends HttpServlet { pri

我有一个java应用程序在bluemix云服务器上运行,我最初在tomcat服务器上本地开发它,然后决定迁移到云。建议无处不在的选项是使用liberty和sqldb服务,经过一些修改后,我在我的bluemix帐户上安装了名为sql-RCT的sql数据库,并将其作为服务绑定到我的java应用程序

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

@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函数中有一个nullpointer异常,我很快就可以缩小到myDataSource对象为null

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

server.xml文件

<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>

beanValidation-1.1
cdi-1.2
ejbLite-3.2
el-3.0
jaxrs-2.0
jdbc-4.1
jndi-1.0
jpa-2.1
jsf-2.2
jsonp-1.0
jsp-2.3
managedBeans-1.0
servlet-3.1
websocket-1.1
icap:managementConnector-1.0
appstate-1.0
cloudAutowiring-1.0

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

@Resource(name = "java:/comp/env/jdbc/SQL-RCT")
    private DataSource myDataSource;
在这个答案上找到它:


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

相反,重写javax.servlet.GenericServlet init()方法并在那里获取连接。此生命周期方法将为您提供与当前尝试在servlet构造函数中创建连接类似的生命周期行为

示例代码:

@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);
        }
    }
}
作为旁注:
由于Liberty使用池连接,因此无需在类作用域中存储连接。如果您在需要连接时获得连接,并在使用完后关闭连接,则不会看到任何性能差异。
如果您想在servlet init代码中获得一个连接,作为急切地获得连接的一种方式,这很好,但它会影响您的servlet加载时间。

您能添加您的
server.xml
?它正在被实例化吗?你在使用spring吗?不,我没有使用spring。这不起作用,bluemix db2是否有一个特定的命名约定?是的,它不起作用,我在这里检查:你可以尝试使用:
DataSource ds=(DataSource)InitialContext.doLookup(“java:jdbc/SQL-RCT”)初始化上下文吗?看看它是否工作或在这里发布它在这里发生的任何异常?[err]javax.naming.NameNotFoundException:java:jdbc/SQL-RCT[err]在javax.naming.InitialContext.doLookup(未知源)[err]在java.lang.reflect.Constructor.newInstance(未知源)。。。[INFO]J2CA8050I:应该使用身份验证别名,而不是在数据源[db2 SQL RCT]上定义用户名和密码。[警告]DSRA8020E:警告:数据源类com.ibm.db2.jcc.DB2ConnectionPoolDataSource上不存在属性“id”。好的,我仔细查找后发现: