使用Liferay 6.1在Tomcat 7环境中设置JNDI

时间:2016-12-21 19:24:27

标签: java tomcat jdbc liferay jndi

我很困惑为什么这不起作用。环境是带有Tomcat 7的Liferay 6.1实例,数据库不是Liferay的默认数据库。它是用于数据的辅助服务器。所以我不确定这与Liferay是否有关。

web.xml (位于Tomcat的webapps / conf中)

<GlobalNamingResources>
<Resource name="jdbc/xxx" auth="Container" type="javax.sql.DataSource" username="a" password="y" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/xxx" 
    maxActive="200" maxIdle="25" />
</GlobalNamingResources>

server.xml (位于Tomcat的webapps / conf中)

<context>
    <ResourceLink global="jdbc/xxx" name="jdbc/xxx" type="javax.sql.DataSource" />
</context>

context.xml (位于Tomcat的webapps / conf中)

        Context ctx = new InitialContext();
        DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/xxx");
        Connection conn = ds.getConnection();

代码

2016-12-21 19:13:04 FATAL asdasdsd:128 - Exception thrown in (removed): 
javax.naming.NameNotFoundException: Name [java:comp/env/jdbc/xxx] is not bound in this Context. Unable to find [java:comp].
    at org.apache.naming.NamingContext.lookup(NamingContext.java:820)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:168)

错误

protocol P {
    func f()
}

extension P {
    func f() { print("default implementation") }
}

enum E: P {
    case Foo
}

let e = E.Foo

e.f()

我错过了什么?

修改

还确认了以下内容:

  1. mysql连接器位于路径
  2. 相同的jar位于portlet的类路径中
  3. 第二次修改

    我使用相同的配置和DAO层创建了一个全新的动态Web应用程序项目,它100%运行。我觉得它现在和Liferay有关。不幸的是..

    第三次修改

    尝试了所有内容,包括这篇文章:http://www.journaldev.com/2513/tomcat-datasource-jndi-example-java

    这也没有用。同样的例外。在Liferay网站上缺乏关于这个问题的信息对我来说是惊人的。文档似乎非常缺乏。

2 个答案:

答案 0 :(得分:0)

另一个解决方案是(它适用于我),从web.xml中删除resource-ref,从服务器中删除资源。 xml并从context.xml中删除ResourceLink。

将资源单独添加到context.xml,

if let img = ImageSelectorImg.image , imageSelected == true{

            let urlStr = "https://post.imageshack.us/upload_api.php"
            let url = URL(string: urlStr)!
            let imgData = UIImageJPEGRepresentation(img, 0.2)!
            let keyData = "AEHKL...66b".data(using: String.Encoding.utf8)!
            let keyJSON = "json".data(using: String.Encoding.utf8)!

            Alamofire.upload(.POST,url,multipartFormData: { multipartFormData in
                    multipartFormData.appendBodyPart(data: imgData, name: "fileupload", fileName:"image", mimeType: "image/jpg")
                    multipartFormData.appendBodyPart(data: keyData, name: "key")
                    multipartFormData.appendBodyPart(data: keyJSON, name: "format")
                },

                encodingCompletion: { encodingResult in

                    switch encodingResult {

                    case .success(let upload, _, _):

                        upload.responseJSON { response in

                            if let info = response.result.value as? Dictionary<String,AnyObject> {

                                if let links = info["links"] as? Dictionary<String,AnyObject> {

                                    if let imgLink = links["image_link"] as? String {
                                        self.postToFirebase(imgLink)
                                    }
                                }
                            }
                        }
                    case.failure(let _): break
                    }
            })
        }

代码(在这种情况下,java:comp / env /是必需的):

<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="20" maxIdle="10" maxWait="-1" name="jdbc/xxx" password="" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/xxx" username=""/>

答案 1 :(得分:0)

对于将来有所帮助的任何人,因为男孩这是一种痛苦而且记录不充分。

我必须将它添加到Liferay应用程序的portlet-ext.properties中:

portal.security.manager.strategy=none

找到此链接后:Liferay/Tomcat "hot-deploy" closes JNDI connection, how can I keep it open?

它最终解决了我的问题。