2014-07-08 78 views
0

我正在从数据库中获取大约17,500条记录,并且正好在结果集执行步骤处获取低于堆栈溢出错误。需要捕捉并显示堆栈溢出错误消息

Query query = dbConnect 
       .createQuery("select nitem from NItem nitem where nitem.id in ("+nitemIdStr+")"); 
     nitemList = query.getResultList(); 

堆栈溢出流量误差

Root cause: 

java.lang.StackOverflowError 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:98) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 
at org.apache.openjpa.jdbc.kernel.exps.OrExpression.acceptVisit(OrExpression.java:99) 


Complete stack: 

org.apache.wicket.WicketRuntimeException: Method onRequest of interface org.apache.wicket.behavior.IBehaviorListener targeted at [email protected] on component [Form [Component id = ajaxexample]] threw an exception 

at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:268) 
at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:241) 
at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.invokeListener(ListenerInterfaceRequestHandler.java:247) 
at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:226) 
at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:854) 
at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64) 
at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:254) 
at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:211) 
at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:282) 
at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:259) 

java.lang.reflect.InvocationTargetException 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:258) 
at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:241) 
at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.invokeListener(ListenerInterfaceRequestHandler.java:247) 
at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:226) 
at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:854) 
at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64) 
at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:254) 
at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:211) 
at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:282) 
at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:259) 

我需要捕捉这个错误,并在UI有消息说“文件导出超过堆栈限制,请使用过滤条件”,而不是越来越显示它在浏览器中检查流量错误。这可能吗???下面

回答

2

的例子为我工作在testpage:

getRequestCycleListeners().add(new AbstractRequestCycleListener() { 
     @Override 
     public IRequestHandler onException(RequestCycle cycle, Exception e) { 
      return new RenderPageRequestHandler(new PageProvider(SomePage.class)); 
     } 
    }); 

在你Application添加这一点,它会将您重定向在异常情况下SomePage.class

但是捕捉堆栈溢出是不好的做法。有很多方法可以防止这种情况,例如限制查询,限制输入大小,跟踪记录处理或跟踪实际堆栈并自行完成。

所以我的建议是防止栈溢出,而不是在检票口捕获它。

+0

我使用了createNativeQuery,它没有给我任何错误。 – user3641156

+0

你可以显示你查询的代码调用吗?它看起来像你有很多基于用户上传的条件。 – Martin

+0

我们能否使用上述方法将错误消息传递给errorpage.class? 我用你的代码,它把我带到errorpage.class,但我想扔那边的消息。有没有办法做到这一点? – user3641156

1

作为一般规则,捕捉错误不是一个好主意,因为它们通常意味着某些事物处于严重不一致的状态。

捕捉国有企业特别成问题,因为不能保证您能够采取行动。虽然在你的具体情况下,当你捕获它来允许你进一步调用时,堆栈可能会是空的,但你可能触发另一个SOE。

顺便说一句,你必须永远不要做:

Query query = dbConnect 
      .createQuery("select nitem from NItem nitem where nitem.id in ("+nitemIdStr+")"); 

严重的是,没有。

enter image description here