Java FacesCompositeELResolver中的NullPointerException如何修复或获得支持?
我们正在生产一个NPE,它使用apache-tomcat-8.5.28或8.5.34(实际上不确定是哪一个,但我可以试试看),具有以下堆栈:Java FacesCompositeELResolver中的NullPointerException如何修复或获得支持?,java,nullpointerexception,jsf-1.2,Java,Nullpointerexception,Jsf 1.2,我们正在生产一个NPE,它使用apache-tomcat-8.5.28或8.5.34(实际上不确定是哪一个,但我可以试试看),具有以下堆栈: java.lang.NullPointerException: while trying to invoke the method javax.el.ELResolver.getValue(javax.el.ELContext, java.lang.Object, java.lang.Object) of a null object loaded from
java.lang.NullPointerException: while trying to invoke the method javax.el.ELResolver.getValue(javax.el.ELContext, java.lang.Object, java.lang.Object) of a null object loaded from an array (which itself was loaded from field javax.el.CompositeELResolver.resolvers of an object) with an index loaded from local variable 'i'
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:62) ~[el-api.jar:3.0.FR]
at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72) ~[jsf-impl.jar:1.2_13-b02-FCS]
at org.apache.el.parser.AstValue.getValue(AstValue.java:169) ~[jasper-el.jar:8.5.34]
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:190) ~[jasper-el.jar:8.5.34]
at com.sun.faces.application.ValueBindingValueExpressionAdapter.getValue(ValueBindingValueExpressionAdapter.java:113) ~[jsf-impl.jar:1.2_13-b02-FCS]
...
该错误并不总是发生,尽管一旦发生,该特定服务器节点似乎会发生很多错误。在过去的几天里,我一直在深入研究反编译的jar,并设置断点来尝试理解错误
该类是扩展了CompositeELResolver
的FacesCompositeELResolver
,并且仅创建了该类的两个实例:一个为chainType=Faces,另一个为chainType=JSP。前一个(其中chainType=Faces)是作为对FacesServlet.service()的第一次调用的一部分创建的,该调用仅在您第一次访问服务器时发生
父类,CompositeElResolver
,正在尝试调用getValue,其代码如下:
// copied from CompositeELResolver.java
public Object getValue(ELContext context, Object base, Object property) {
context.setPropertyResolved(false);
int sz = this.size;
for(int i = 0; i < sz; ++i) {
Object result = this.resolvers[i].getValue(context, base, property); // <---- line 62 NPE here
if(context.isPropertyResolved()) {
return result;
}
}
return null;
}
这可能就是问题所在,虽然我还没有重现这个问题,但我怀疑上面的堆栈是罪魁祸首
总结一下,一个静态函数elotils.buildFacesResolver正在修改FacesCompositeELResolver类型的共享对象,如果服务器是“幸运的”足够在启动时在两个线程中调用同一堆栈,这将在singleton实例中产生一个this.resolvers
数组,其中包含一个null对象,该对象将不断通过NullPointerException,直到服务器被弹回为止—这似乎正是我们所看到的
但这里有一件事,这一切都不属于正在运行的应用程序代码,它似乎是我们正在使用的jsf-impl.jar的一部分,根据该jar中的manifest.mf文件,它似乎是版本1.2_13-b02-FCS的一部分。我不确定这个版本是从哪里来的,或者如果我需要的话,我如何修改它
有人能帮助我了解我在哪些方面可以获得这些特定类的支持吗?这是我可以控制的吗
有人能提供的任何其他帮助或线索都会很有帮助
// copied from CompositeELResolver.java
public void add(ELResolver elResolver) {
Objects.requireNonNull(elResolver); // <---- line 47
if(this.size >= this.resolvers.length) {
ELResolver[] nr = new ELResolver[this.size * 2];
System.arraycopy(this.resolvers, 0, nr, 0, this.size);
this.resolvers = nr;
}
this.resolvers[this.size++] = elResolver; // <---- line 54
}
javax.el.CompositeELResolver.add():54
com.sun.faces.el.FacesCompositeElResolver.add():60
com.sun.faces.el.ElUtils.buildFacesResolver():160