weblogic中oracle数据源 利用JNDI 测试报错:java.lang.Object cannot be cast to java.io.Serial

tbirdzgw 2010-07-29 03:14:09
测试类如下:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class HelloClient {
public static void main(String args[]){
String url = "t3://localhost:7001";
Context initCtx = null;
try{
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
env.put(Context.SECURITY_PRINCIPAL, "username" );
env.put(Context.SECURITY_CREDENTIALS, "password" );
env.put(Context.PROVIDER_URL, url);
initCtx = new InitialContext(env);
System.out.println(initCtx);
}catch(Exception e){
System.out.println("Cannot get initial context: " + e.getMessage());
System.exit(1);
}


try {
DataSource ds = (DataSource) initCtx.lookup("OracleDs");
Connection conn = ds.getConnection();
//System.out.println(conn);
Statement stmt=conn.createStatement();
String sql="select * from net_monitorcamera";
ResultSet rs=stmt.executeQuery(sql);
while (rs.next()){
System.out.println(rs.getObject(1));
}
} catch (NamingException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}
catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}

}

}


JNDI如下:
此页中显示了有关该绑定对象的详细信息。

绑定名: OracleDs
类: weblogic.jdbc.common.internal.RmiDataSource
散列代码: 24563485
转换为字符串结果: weblogic.jdbc.common.internal

工程中导入了jar包有:
Oracle 10g 10.2.0.3 JDBC_ojdbc14.jar oracle数据库驱动
weblogic.jar
wlclient.jar


我在运行测试类时,在
DataSource ds = (DataSource) initCtx.lookup("OracleDs");
Connection conn = ds.getConnection();报错了,我直接打印ds 看了一下,它不是对象了
而是:IOR:0000000000000044524d493a7765626c6f6769632e6a6462632e636f6d6d6f6e2e......很长的一段
好像是不能转换成DataSource对象
也不知道哪错了
希望哪位高手能帮帮忙,万分感谢!!!!!


...全文
1494 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
数据流 2011-11-29
  • 打赏
  • 举报
回复
再者,检查你的项目中的客户端使用的包,你可能使用的是wlclient.jar这个包,这个包中的DataSource和Connection都是不可串行化的,也就是说屏蔽了网络传输这些对象。

而weblogic.jar中的包则没有。

你需要做的是,将客户端中的wlclient.jar去掉;

如果必须要用的话,一定要放在weblogic.jar包的后面,否则项目从会将这些包从前往后匹配,找到类型匹配(注意不是类型相同)即停止查找,导致上述错误.
数据流 2011-11-28
  • 打赏
  • 举报
回复
请思考一个问题:数据源DataSource对象是用来获得数据库连接Connection的,当然需要保证安全,否则任何客户端从远程主机获取连接到本地,岂不是破坏了这种安全性?

从你的代码上看,你是试图从其他客户端(和WebLogic的服务器不在同一个JVM)远程获取数据源,当然获取不了。请将这段代码放在项目中,比如一个JSP页中,通过发送请求的方式来访问就可以访问了。当然,该项目要使用WebLogic服务器。

从中可以看出,Oracle公司在开发Weblogic的时候,没有将Weblogic用到的数据源类DataSource实现Serializable接口,从而避免了通过网络传输该对象,也就保证了这种商业服务器的数据安全性。
chitu11 2011-01-25
  • 打赏
  • 举报
回复
怎么 解决的?我也遇到这错了
tbirdzgw 2010-08-03
  • 打赏
  • 举报
回复
没人回答啊!小弟写这方面的,能力有限,还请各位大侠多多帮忙啊!
小弟比较急啊!!!
在此我再补充一下报的错是这样的
java.lang.ClassCastException: weblogic.jdbc.common.internal.ConnectionEnv cannot be cast to java.io.Serializable
at weblogic.iiop.IIOPOutputStream.writeObject(IIOPOutputStream.java:2266)
at weblogic.utils.io.ObjectStreamClass.writeFields(ObjectStreamClass.java:413)
at weblogic.corba.utils.ValueHandlerImpl.writeValueData(ValueHandlerImpl.java:235)
at weblogic.corba.utils.ValueHandlerImpl.writeValueData(ValueHandlerImpl.java:225)
at weblogic.corba.utils.ValueHandlerImpl.writeValue(ValueHandlerImpl.java:182)
at weblogic.iiop.IIOPOutputStream.write_value(IIOPOutputStream.java:1963)
at weblogic.iiop.IIOPOutputStream.write_value(IIOPOutputStream.java:2001)
at weblogic.iiop.IIOPOutputStream.writeObject(IIOPOutputStream.java:2266)
at weblogic.jdbc.common.internal.RmiDataSource_WLSkel.invoke(Unknown Source)
at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:589)
at weblogic.rmi.cluster.ClusterableServerRef.invoke(ClusterableServerRef.java:230)
at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:477)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:147)
at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:473)
at weblogic.rmi.internal.wls.WLSExecuteRequest.run(WLSExecuteRequest.java:118)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)

5,657

社区成员

发帖
与我相关
我的任务
社区描述
Web开发应用服务器相关讨论专区
社区管理员
  • 应用服务器社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧