Hi!
I've got a NullPointerException in my interceptor class, but I could find the reason why.
The error log entry:
2005-04-19 14:52:06 StandardWrapperValve[control]: Servlet.service() for servlet control threw exception
java.lang.NullPointerException
at interceptors.ctoDelete2HistBackInterceptor.preDelete(ctoDelete2HistBackInterceptor.java:32)
at org.dbforms.event.DbEventInterceptorSupport.preDelete(DbEventInterceptorSupport.java:188)
at org.dbforms.config.Table.processInterceptors(Table.java:1991)
at org.dbforms.event.datalist.DeleteEvent.processEvent(DeleteEvent.java:134)
at org.dbforms.servlets.Controller.process(Controller.java:309)
at org.dbforms.servlets.Controller.doPost(Controller.java:107)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.dbforms.util.external.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:190)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:534)
public class ctoDelete2HistBackInterceptor extends DbEventInterceptorSupport
{
public int preDelete(HttpServletRequest request,
Table table,
FieldValues fieldValues,
DbFormsConfig config,
Connection con) throws ValidationException
{
if (fieldValues != null)
{
String strDocID = "";
String strHistID = "";
int Row = 0;
//Here I get my java.lang.NullPointerException:
strHistID = (String) fieldValues.get("id").getFieldValue();
strDocID = (String) fieldValues.get("doc_id").getFieldValue();
Could you imagine why this could happen? I just checked my table definition in the dbforms-config.xml again and again, but all seems to be OK...
Are there other points to take care of? There must be a reason why the field names didn't work in the 'cto_doc_versions' table. If I use the interceptor in another table, where the same field names also exist, the interceptor works without a exception.
regards Theo
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hi!
I've got a NullPointerException in my interceptor class, but I could find the reason why.
The error log entry:
2005-04-19 14:52:06 StandardWrapperValve[control]: Servlet.service() for servlet control threw exception
java.lang.NullPointerException
at interceptors.ctoDelete2HistBackInterceptor.preDelete(ctoDelete2HistBackInterceptor.java:32)
at org.dbforms.event.DbEventInterceptorSupport.preDelete(DbEventInterceptorSupport.java:188)
at org.dbforms.config.Table.processInterceptors(Table.java:1991)
at org.dbforms.event.datalist.DeleteEvent.processEvent(DeleteEvent.java:134)
at org.dbforms.servlets.Controller.process(Controller.java:309)
at org.dbforms.servlets.Controller.doPost(Controller.java:107)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.dbforms.util.external.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:190)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:534)
The interceptor class:
package interceptors;
import org.dbforms.config.DbFormsConfig;
import org.dbforms.config.FieldValue;
import org.dbforms.config.FieldValues;
import org.dbforms.config.Table;
import org.dbforms.config.ValidationException;
import org.dbforms.event.DbEventInterceptorSupport;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.http.HttpServletRequest;
public class ctoDelete2HistBackInterceptor extends DbEventInterceptorSupport
{
public int preDelete(HttpServletRequest request,
Table table,
FieldValues fieldValues,
DbFormsConfig config,
Connection con) throws ValidationException
{
if (fieldValues != null)
{
String strDocID = "";
String strHistID = "";
int Row = 0;
//Here I get my java.lang.NullPointerException:
strHistID = (String) fieldValues.get("id").getFieldValue();
strDocID = (String) fieldValues.get("doc_id").getFieldValue();
//Debug:
//strDocID = "537";
//strHistID = "1";
if ((strDocID != null) && (strHistID != ""))
{
String backupDocQuery =
"INSERT INTO cto_doc_versions (cto_doc_versions.name, cto_doc_versions.doc_id, " +
"cto_doc_versions.xdt_file, cto_doc_versions.xdt_file_name, cto_doc_versions.tsl_file, " +
"cto_doc_versions.tsl_file_name, cto_doc_versions.last_edit_by, cto_doc_versions.last_edit_time) " +
"SELECT cto_docs.name, cto_docs.id, cto_docs.xdt_file, cto_docs.xdt_file_name, cto_docs.tsl_file, " +
"cto_docs.tsl_file_name, cto_docs.last_edit_by, cto_docs.last_edit_time " +
"FROM cto_docs WHERE cto_docs.id = " + strDocID + ";";
String activateDocQuery =
"UPDATE cto_docs, cto_doc_versions SET " +
"cto_docs.name = cto_doc_versions.name, cto_docs.xdt_file = cto_doc_versions.xdt_file, " +
"cto_docs.xdt_file_name = cto_doc_versions.xdt_file_name, cto_docs.tsl_file = cto_doc_versions.tsl_file, " +
"cto_docs.tsl_file_name = cto_doc_versions.tsl_file_name, cto_docs.last_edit_by = cto_doc_versions.last_edit_by, " +
"cto_docs.last_edit_time = cto_doc_versions.last_edit_time " +
"WHERE cto_doc_versions.id = " + strHistID + " AND cto_doc_versions.doc_id = cto_docs.id;";
try
{
Statement stmt = con.createStatement();
Row = stmt.executeUpdate(backupDocQuery);
Row = stmt.executeUpdate(activateDocQuery);
stmt.close();
}
catch (SQLException e)
{
System.out.println("Datenbankfehler: " + e.getMessage());
return IGNORE_OPERATION;
}
}
}
return GRANT_OPERATION;
}
}
My table definition:
<table name="cto_doc_versions" defaultVisibleFields="id">
<field name="id" fieldType="int" size="11" isKey="true" autoInc="true" />
<field name="name" fieldType="varchar" size="50" />
<field name="doc_id" fieldType="int" size="11" isKey="true" />
<field name="xdt_file" fieldType="blob" size="16277215" />
<field name="xdt_file_name" fieldType="varchar" size="255" />
<field name="tsl_file" fieldType="blob" size="16277215" />
<field name="tsl_file_name" fieldType="varchar" size="255" />
<field name="last_edit_by" fieldType="int" size="11" />
<field name="last_edit_time" fieldType="timestamp" size="14" />
<!-- add "granted-privileges" element for security constraints -->
<interceptor className = "interceptors.ctoDelete2HistBackInterceptor"/>
</table>
Could anybody give me a hint, where the problem is?
Thanks in advance + regards
Theo
What's about debugging?
Which is line 32 in your interceptor?
Henner
It's this place in the code:
strHistID = (String) fieldValues.get("id").getFieldValue();
strDocID = (String) fieldValues.get("doc_id").getFieldValue();
If I comment out this two lines to try some fixed String values instead, everythings working fine.
Any idea with this?
regards Theo
Yes, seems that ) fieldValues.get("id") returns null. Means that this values are not in the fieldValues list - why ever.
Henner
Could you imagine why this could happen? I just checked my table definition in the dbforms-config.xml again and again, but all seems to be OK...
Are there other points to take care of? There must be a reason why the field names didn't work in the 'cto_doc_versions' table. If I use the interceptor in another table, where the same field names also exist, the interceptor works without a exception.
regards Theo
Are the fields defined in the jsp?
Not really. It's a standard form with a subform in it. The interceptor works for the embedded table form.
I will take a closer look to JSP.
regards Theo