Friday, May 11, 2007

Extending ADF's FacesPageLifecycle

Recently I've encountered strange exceptions while testing my application. I pressed the Submit button and sometimes everything was fine, while at times the action bound to the button was not invoked, but errors were reported:

JBO-29000: null
java.lang.NullPointerException


Unfortunately, there was no trace of this exception and I didn't even know where should I look for it. Then I came up with and idea: let's decorate the process of displaying errors and find out more about this exception. To achieve this, I had to extend ADF's FacesPageLifecycle:

package januszm.adf.util;

import javax.faces.context.FacesContext;

import oracle.adf.controller.faces.lifecycle.FacesPageLifecycle;

import oracle.binding.AttributeBinding;

public class MyPageLifecycle extends FacesPageLifecycle {
protected void addMessage(FacesContext context, AttributeBinding binding,
Throwable error) {
super.addMessage( context, binding, error );
// the easiest thing we can do here
error.printStackTrace();
}
}


Another question is: how can we tell ADF to use our lifecycle? That's easy too - we extend ADFPhaseListener:

package januszm.adf.util;

import oracle.adf.controller.faces.lifecycle.ADFPhaseListener;
import oracle.adf.controller.v2.lifecycle.PageLifecycle;


public class MyPhaseListener extends ADFPhaseListener {
protected PageLifecycle createPageLifecycle() {
return new MyPageLifecycle();
}
}


Finally, we need to substitute the original ADFPhaseListener with our class in faces-config.xml:

<lifecycle>
<phase-listener>januszm.adf.util.MyPhaseListener</phase-listener>
</lifecycle>


That allowed me to locate the problem - the exception was thrown in the line containing:

this.someField.toString()


because sometimes the field wasn't set...

The conclusion is simple - if a library throws a weird exception, don't blame the library, but check YOUR code first.

4 comments:

Anonymous said...

Hi,


Thank you very much for your input. At least now I manage to show some stack trace. However it still too vague to me what is happening around my codes and maybe you can help me out:

Dec 1, 2008 9:02:56 AM oracle.adf.controller.faces.lifecycle.FacesPageLifecycle addMessage
WARNING: JBO-29000: Unexpected exception caught: java.lang.NullPointerException, msg=null
oracle.jbo.JboException: JBO-29000: Unexpected exception caught: java.lang.NullPointerException, msg=null
at oracle.adf.model.binding.DCBindingContainer.reportException(DCBindingContainer.java:228)
at oracle.adf.model.binding.DCBindingContainer.reportException(DCBindingContainer.java:274)
at oracle.adf.model.binding.DCControlBinding.reportException(DCControlBinding.java:187)
at oracle.jbo.uicli.binding.JUCtrlValueBinding.getAttributeFromRow(JUCtrlValueBinding.java:476)
at oracle.jbo.uicli.binding.JUCtrlValueBinding.getAttributes(JUCtrlValueBinding.java:901)
at oracle.jbo.uicli.binding.JUCtrlHierNodeBinding.refresh(JUCtrlHierNodeBinding.java:504)
at oracle.jbo.uicli.binding.JUCtrlHierNodeBinding.updateValuesFromRow(JUCtrlHierNodeBinding.java:523)
at oracle.jbo.uicli.binding.JUIteratorBinding.updateValuesFromRows(JUIteratorBinding.java:315)
at oracle.adf.model.binding.DCIteratorBinding.refreshControl(DCIteratorBinding.java:693)
at oracle.adf.model.binding.DCIteratorBinding.rangeRefreshed(DCIteratorBinding.java:735)
at oracle.jbo.common.RowSetHelper.fireRangeRefreshed(RowSetHelper.java:172)
at oracle.adf.model.generic.DCRowSetIteratorImpl.notifyRangeRefreshed(DCRowSetIteratorImpl.java:1570)
at oracle.adf.model.generic.DCRowSetIteratorImpl.buildProviderIterator(DCRowSetIteratorImpl.java:465)
at oracle.adf.model.generic.DCRowSetIteratorImpl.fetchDataSource(DCRowSetIteratorImpl.java:394)
at oracle.adf.model.generic.DCGenericRowSetIteratorImpl.notifyNavigationEvent(DCGenericRowSetIteratorImpl.java:331)
at oracle.adf.model.generic.DCRowSetIteratorImpl.syncIterator(DCRowSetIteratorImpl.java:258)
at oracle.adf.model.generic.DCRowSetIteratorImpl.first(DCRowSetIteratorImpl.java:653)
at oracle.adf.model.binding.DCIteratorBinding.refreshControl(DCIteratorBinding.java:649)
at oracle.adf.model.binding.DCIteratorBinding.rangeRefreshed(DCIteratorBinding.java:735)
at oracle.jbo.common.RowSetHelper.fireRangeRefreshed(RowSetHelper.java:172)
at oracle.adf.model.generic.DCRowSetIteratorImpl.notifyRangeRefreshed(DCRowSetIteratorImpl.java:1570)
at oracle.adf.model.generic.DCRowSetIteratorImpl.buildProviderIterator(DCRowSetIteratorImpl.java:465)
at oracle.adf.model.generic.DCRowSetIteratorImpl.fetchDataSource(DCRowSetIteratorImpl.java:394)
at oracle.adf.model.generic.DCRowSetIteratorImpl.bringRows(DCRowSetIteratorImpl.java:478)
at oracle.adf.model.generic.DCRowSetIteratorImpl.isIndexValid(DCRowSetIteratorImpl.java:812)
at oracle.adf.model.generic.DCRowSetIteratorImpl.setRangeStart(DCRowSetIteratorImpl.java:868)
at oracle.adf.model.generic.DCRowSetIteratorImpl.scrollRangeTo(DCRowSetIteratorImpl.java:920)
at oracle.adf.model.generic.DCRowSetIteratorImpl.first(DCRowSetIteratorImpl.java:648)
at oracle.adf.model.binding.DCIteratorBinding.refreshControl(DCIteratorBinding.java:649)
at oracle.adf.model.binding.DCIteratorBinding.refresh(DCIteratorBinding.java:3499)
at oracle.adf.model.binding.DCBindingContainer.refreshExecutables(DCBindingContainer.java:2637)
at oracle.adf.model.binding.DCBindingContainer.internalRefreshControl(DCBindingContainer.java:2568)
at oracle.adf.model.binding.DCBindingContainer.refresh(DCBindingContainer.java:2260)
at oracle.adf.controller.v2.lifecycle.PageLifecycleImpl.prepareModel(PageLifecycleImpl.java:99)
at oracle.adf.controller.faces.lifecycle.FacesPageLifecycle.prepareModel(FacesPageLifecycle.java:72)
at oracle.adf.controller.v2.lifecycle.Lifecycle$8.execute(Lifecycle.java:210)
at oracle.adf.controller.v2.lifecycle.Lifecycle.executePhase(Lifecycle.java:116)
at oracle.adf.controller.faces.lifecycle.ADFPhaseListener.mav$executePhase(ADFPhaseListener.java:29)
at oracle.adf.controller.faces.lifecycle.ADFPhaseListener$1.before(ADFPhaseListener.java:412)
at oracle.adf.controller.faces.lifecycle.ADFPhaseListener.beforePhase(ADFPhaseListener.java:77)
at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:228)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:137)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:214)
at com.evermind.server.http.ResourceFilterChain.doFilter(ResourceFilterChain.java:65)
at oracle.adfinternal.view.faces.webapp.AdfFacesFilterImpl._invokeDoFilter(AdfFacesFilterImpl.java:228)
at oracle.adfinternal.view.faces.webapp.AdfFacesFilterImpl._doFilterImpl(AdfFacesFilterImpl.java:197)
at oracle.adfinternal.view.faces.webapp.AdfFacesFilterImpl.doFilter(AdfFacesFilterImpl.java:123)
at oracle.adf.view.faces.webapp.AdfFacesFilter.doFilter(AdfFacesFilter.java:103)
at com.evermind.server.http.EvermindFilterChain.doFilter(EvermindFilterChain.java:15)
at oracle.adf.model.servlet.ADFBindingFilter.doFilter(ADFBindingFilter.java:162)
at com.evermind.server.http.EvermindFilterChain.doFilter(EvermindFilterChain.java:17)
at xx.xxx.xxx.xxx.xxxx.filter.MySessionFilter.doFilter(MySessionFilter.java:124)
at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:621)
at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:370)
at com.evermind.server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler.java:871)
at com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:453)
at com.evermind.server.http.HttpRequestHandler.serveOneRequest(HttpRequestHandler.java:221)
at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:122)
at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:111)
at oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(ServerSocketReadHandler.java:260)
at com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:303)
at java.lang.Thread.run(Thread.java:595)


I build a page of Inline Detail table created from POJOs via DataContol/EJB method...
This is the first time I encountered this error. The problem is it is inconsistent. sometimes it works sometime it don't whenever I tried to re-access the page all over again...

Please let me know if problem statements are not clear enough...

Thanks,
Abdul
aabubakar555@yahoo.com

Anonymous said...

I found this site using [url=http://google.com]google.com[/url] And i want to thank you for your work. You have done really very good site. Great work, great site! Thank you!

Sorry for offtopic

Anonymous said...

малолетка сосет член фото http://free-3x.com/ русскую студентку трахают free-3x.com/ порно онлайн оргии студентов [url=http://free-3x.com/]free-3x.com[/url]

Anonymous said...

Who knows where to download XRumer 5.0 Palladium?
Help, please. All recommend this program to effectively advertise on the Internet, this is the best program!