Protostuff是一个基于protobuf实现的序列化方法。前段时间,初次接手项目,需要将java bean存储到redis中,一切编码完毕,上测试环境,程序很快就会停止,后来查看tomcat日志,发现如下错误:
后来经过多次定位,发现新写的java bean,新写了带参的构造函数,没有添加默认的无参构造函数。而一个类如果已经写构造函数,编译的时候jvm不会默认添加无参构造函数,这就导致了问题。在Protostuff源码中有这么一段代码,需要使用对应java bean的无参构造函数,这样就导致了如上错误的出现。
public Schema<T> getSchema() {
Schema<T> schema = this.schema;
if(schema == null) {
synchronized(this) {
schema = this.schema;
if(this.schema == null) {
if(Message.class.isAssignableFrom(this.typeClass)) {
try {
Message<T> m = (Message)this.typeClass.newInstance();//使用的无参构造函数创建类
this.schema = schema = m.cachedSchema();
} catch (InstantiationException var5) {
throw new RuntimeException(var5);
} catch (IllegalAccessException var6) {
throw new RuntimeException(var6);
}
} else {
this.schema = schema = this.strategy.newSchema(this.typeClass);
}
}
}
}