在项目中添加了log4j输出至数据库,自定义了一个Log2OrclObject,结构如下:
public class Log2OrclObject { private int log_id; private String log_user; private String log_ip; private String log_sys_name; private String log_fun_model; private String log_message; private String log_date; private String log_level; private String log_identity; private String log_exception; private String log_logger; private String log_source; } 扩展了JdbcAppender,CustomJdbcAppender,如下:
public class CustomJdbcAppender extends AppenderSkeleton { private String user; private String pass; private String driver; private String url; private PreparedStatement pst; protected void append(LoggingEvent event) { this.sql = "insert into Y05_SYSTEMLOGS values(Y05_SYSTEMLOGS_SEQ.nextval,?,?,?,?,?,?,?,?,?,?,?)"; try { Class.forName(this.driver); Connection conn = DriverManager.getConnection(this.url, this.user, this.pass); this.pst = conn.prepareStatement(this.sql); Log2OrclObject log2OracleObject = (Log2OrclObject)event.getMessage(); ... }
这么写出来,单独用测试类测试的时候时没有问题的,但是当项目启动时,就会报错:
java.lang.ClassCastException:java.lang.String cannot be cast to com.log4j.Log2OracObject
位置就是在这一行中:
Log2OrclObject log2OracleObject = (Log2OrclObject)event.getMessage();
求解这是什么问题啊? 本来log4j中 event.getMessage()获取到的就是Object类型了,为什么初始化的时候会报是String类型的错误呢?
event.GetMessage()
定义的返回 Object
类型,这只是一个引用类型,但引用的对象实际是什么类型在这里是看不出来的。从报错的情况来看,这里实际是一个 String
类型的对象,而不是 Log2OrclObject
对象,所以就报 ClassCastException
了。
简单的举个例子,
Object o = "Hello World"; // o 是 Object 引用,但实际是 String 类型的对象
Integer n = (Integer) o; // ClassCastException