cancel
Showing results for 
Search instead for 
Did you mean: 

EJBs cannot return null when used in Model?

Former Member
0 Kudos

Hi,

hopefully this question is in the right place.

I´ve spent now a few days on tracking a single problem. I am trying to create an web dynpro application with the functionality contained in EJBs. One of my methods in a stateless SessionBean returns an object or null. This SessionBean is bound via model binding to the context of a component controller. Everything works fine as along as the method call returns an object, but if it does not (which is the usual case) the application throws an empty exception without any description. Thanks to this forum i checked the defaultTrace log and found this information:


[EXCEPTION]
 {0}#1#java.lang.NullPointerException
	at com.sap.tc.webdynpro.model.ejb.model.EJBGenericModelClassExecutable.setPropertiesForModelClass(EJBGenericModelClassExecutable.java:429)
	at com.sap.tc.webdynpro.model.ejb.model.EJBGenericModelClassExecutable.fillReturnParameterToMc(EJBGenericModelClassExecutable.java:634)
	at com.sap.tc.webdynpro.model.ejb.model.EJBGenericModelClassExecutable.execute(EJBGenericModelClassExecutable.java:135)
	at com.test.testprog.testprogwebdynpro.main.Main.doLogin(Main.java:243)
	at com.test.testprog.testprogwebdynpro.main.wdp.InternalMain.doLogin(InternalMain.java:213)
	at com.test.testprog.testprogwebdynpro.main.LoginView.onActionButtonEinloggen(LoginView.java:189)
	at com.test.testprog.testprogwebdynpro.main.wdp.InternalLoginView.wdInvokeEventHandler(InternalLoginView.java:139)
	at com.sap.tc.webdynpro.progmodel.generation.DelegatingView.invokeEventHandler(DelegatingView.java:131)
	at com.sap.tc.webdynpro.progmodel.controller.Action.fire(Action.java:72)
	at com.sap.tc.webdynpro.clientserver.phases.ProcessingEventPhase.doHandleActionEvent(ProcessingEventPhase.java:156)
	at com.sap.tc.webdynpro.clientserver.phases.ProcessingEventPhase.execute(ProcessingEventPhase.java:91)
	at com.sap.tc.webdynpro.clientserver.window.WindowPhaseModel.processRequestPartly(WindowPhaseModel.java:161)
	at com.sap.tc.webdynpro.clientserver.window.WindowPhaseModel.doProcessRequest(WindowPhaseModel.java:109)
	at com.sap.tc.webdynpro.clientserver.window.WindowPhaseModel.processRequest(WindowPhaseModel.java:96)
	at com.sap.tc.webdynpro.clientserver.window.WebDynproWindow.processRequest(WebDynproWindow.java:469)
	at com.sap.tc.webdynpro.clientserver.cal.AbstractClient.executeTasks(AbstractClient.java:52)
	at com.sap.tc.webdynpro.clientserver.cal.ClientApplication.doExecute(ClientApplication.java:1431)
	at com.sap.tc.webdynpro.clientserver.cal.ClientApplication.doProcessing(ClientApplication.java:1251)
	at com.sap.tc.webdynpro.serverimpl.core.sessionctx.AbstractExecutionContextDispatcher.delegateToApplicationDoProcessing(AbstractExecutionContextDispatcher.java:158)
	at com.sap.tc.webdynpro.serverimpl.wdc.sessionctx.DispatchHandlerForAppProcessing.doService(DispatchHandlerForAppProcessing.java:35)
	at com.sap.tc.webdynpro.serverimpl.wdc.sessionctx.AbstractDispatchHandler.service(AbstractDispatchHandler.java:116)
	at com.sap.engine.services.servlets_jsp.server.deploy.impl.module.IRequestDispatcherImpl.dispatch(IRequestDispatcherImpl.java:93)
	at com.sap.tc.webdynpro.serverimpl.wdc.sessionctx.ExecutionContextDispatcher.dispatchToApplicationDoProcessing(ExecutionContextDispatcher.java:114)
	at com.sap.tc.webdynpro.serverimpl.core.sessionctx.AbstractExecutionContextDispatcher.dispatch(AbstractExecutionContextDispatcher.java:81)
	at com.sap.tc.webdynpro.clientserver.session.ApplicationSession.dispatch(ApplicationSession.java:507)
	at com.sap.tc.webdynpro.clientserver.session.ApplicationSession.dispatch(ApplicationSession.java:527)
	at com.sap.tc.webdynpro.clientserver.session.ApplicationSession.doApplicationProcessingStandalone(ApplicationSession.java:458)
	at com.sap.tc.webdynpro.clientserver.session.ApplicationSession.doProcessing(ApplicationSession.java:249)
	at com.sap.tc.webdynpro.clientserver.session.ClientSession.doApplicationProcessing(ClientSession.java:699)
	at com.sap.tc.webdynpro.clientserver.session.ClientSession.doProcessing(ClientSession.java:231)
	at com.sap.tc.webdynpro.clientserver.session.RequestManager.doProcessing(RequestManager.java:231)
	at com.sap.tc.webdynpro.serverimpl.core.sessionctx.AbstractExecutionContextDispatcher.delegateToRequestManager(AbstractExecutionContextDispatcher.java:205)
	at com.sap.tc.webdynpro.serverimpl.wdc.sessionctx.DispatchHandlerForRequestManager.doService(DispatchHandlerForRequestManager.java:38)
	at com.sap.tc.webdynpro.serverimpl.wdc.sessionctx.AbstractDispatchHandler.service(AbstractDispatchHandler.java:116)
	at com.sap.engine.services.servlets_jsp.server.deploy.impl.module.IRequestDispatcherImpl.dispatch(IRequestDispatcherImpl.java:93)
	at com.sap.tc.webdynpro.serverimpl.wdc.sessionctx.ExecutionContextDispatcher.dispatchToRequestManager(ExecutionContextDispatcher.java:140)
	at com.sap.tc.webdynpro.serverimpl.core.sessionctx.AbstractExecutionContextDispatcher.dispatch(AbstractExecutionContextDispatcher.java:93)
	at com.sap.tc.webdynpro.serverimpl.core.sessionctx.AbstractExecutionContextDispatcher.dispatch(AbstractExecutionContextDispatcher.java:105)
	at com.sap.tc.webdynpro.serverimpl.core.AbstractDispatcherServlet.doContent(AbstractDispatcherServlet.java:87)
	at com.sap.tc.webdynpro.serverimpl.core.AbstractDispatcherServlet.doPost(AbstractDispatcherServlet.java:61)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
	at com.sap.engine.services.servlets_jsp.server.Invokable.invoke(Invokable.java:66)
	at com.sap.engine.services.servlets_jsp.server.Invokable.invoke(Invokable.java:32)
	at com.sap.engine.services.servlets_jsp.server.HttpHandlerImpl.runServlet(HttpHandlerImpl.java:431)
	at com.sap.engine.services.servlets_jsp.server.HttpHandlerImpl.handleRequest(HttpHandlerImpl.java:289)
	at com.sap.engine.services.httpserver.server.RequestAnalizer.startServlet(RequestAnalizer.java:387)
	at com.sap.engine.services.httpserver.server.RequestAnalizer.startServlet(RequestAnalizer.java:376)
	at com.sap.engine.services.servlets_jsp.filters.ServletSelector.process(ServletSelector.java:85)
	at com.sap.engine.services.httpserver.chain.AbstractChain.process(AbstractChain.java:71)
	at com.sap.engine.services.servlets_jsp.filters.ApplicationSelector.process(ApplicationSelector.java:160)
	at com.sap.engine.services.httpserver.chain.AbstractChain.process(AbstractChain.java:71)
	at com.sap.engine.services.httpserver.filters.WebContainerInvoker.process(WebContainerInvoker.java:67)
	at com.sap.engine.services.httpserver.chain.HostFilter.process(HostFilter.java:9)
	at com.sap.engine.services.httpserver.chain.AbstractChain.process(AbstractChain.java:71)
	at com.sap.engine.services.httpserver.filters.ResponseLogWriter.process(ResponseLogWriter.java:60)
	at com.sap.engine.services.httpserver.chain.HostFilter.process(HostFilter.java:9)
	at com.sap.engine.services.httpserver.chain.AbstractChain.process(AbstractChain.java:71)
	at com.sap.engine.services.httpserver.filters.DefineHostFilter.process(DefineHostFilter.java:27)
	at com.sap.engine.services.httpserver.chain.ServerFilter.process(ServerFilter.java:12)
	at com.sap.engine.services.httpserver.chain.AbstractChain.process(AbstractChain.java:71)
	at com.sap.engine.services.httpserver.filters.MonitoringFilter.process(MonitoringFilter.java:29)
	at com.sap.engine.services.httpserver.chain.ServerFilter.process(ServerFilter.java:12)
	at com.sap.engine.services.httpserver.chain.AbstractChain.process(AbstractChain.java:71)
	at com.sap.engine.services.httpserver.server.Processor.chainedRequest(Processor.java:309)
	at com.sap.engine.services.httpserver.server.Processor$FCAProcessorThread.run(Processor.java:222)
	at com.sap.engine.core.thread.impl3.ActionObject.run(ActionObject.java:37)
	at java.security.AccessController.doPrivileged(Native Method)
	at com.sap.engine.core.thread.impl3.SingleThread.execute(SingleThread.java:152)
	at com.sap.engine.core.thread.impl3.SingleThread.run(SingleThread.java:247)

The request has the cardinality 1..1, the response 0..1 and the return value 1..1. The last one cannot be changed.

Is that correct that an EJB method call must return an valid object or do i have to change something in order to allow the return of null? Or is this a bug?

Thanks for any answer in advance

Accepted Solutions (0)

Answers (3)

Answers (3)

Former Member
0 Kudos

Sorry, these are not very helpful answers They don´t help me to understand the problem.

A workaround is always possible.

The exception thrown by this problem is rather generic (EJBModelException or something like this), so it´s not very practicable to catch it.

Former Member
0 Kudos

Nelles,

I have the same scenario (EJB's as Model in WDP).

Request Cardinality : 0:1

Response Cardinality : 0:1

Return Cardinaliy : 0:n

And in my case, the EJB's run perfectly even when the null values comes from the backend. No Exception at all...

Please check the implementation of your EJB, though I am not sure. But maybe thats where your problem lies..

Regards

Edited by: Amit T on Oct 16, 2008 11:48 AM

Former Member
0 Kudos

Hi,

what are you returning? Objects or basic types? When the methods says it returns a string, a null object is no problem. Btw. i cannot set the cardinality of the of the return node. It´s fixed as 1..1.

My session bean looks so


@Stateless(name="TestBean")
@WebService
public class TestBean implements TestLocal {
	
	public int add(int zahl1, int zahl2)
	{
		return zahl1 + zahl2;
	}
	
	public String concat(String text1, String text2)
	{
		return text1.concat(text2);
	}
	
	public String zeroString(String text1)
	{
		return null;
	}
	
	public User zeroUser(String text1)
	{
		return null;
	}
}

The WDP Controller Method looks like this


  public void doejbtest( )  {
    //@@begin doejbtest()
	  try
	  {
		  IZeroStringRequestElement req = wdContext.currentZeroStringRequestElement();
		  Request_TestLocal_zeroString obj = req.modelObject();
		  req.setText1("test");
		  obj.execute();
		  wdComponentAPI.getMessageManager().reportWarning("String request was successful");
	  }
	  catch(Exception e)
	  {
		  wdComponentAPI.getMessageManager().reportException("String request failed");
		  wdComponentAPI.getMessageManager().raisePendingException();
	  } 
	  try
	  {
		  IZeroUserRequestElement req = wdContext.currentZeroUserRequestElement();
		  Request_TestLocal_zeroUser obj = req.modelObject();
		  req.setText1("test");
		  obj.execute();
		  wdComponentAPI.getMessageManager().reportWarning("User request was successful");
	  }
	  catch(Exception e)
	  {
		  wdComponentAPI.getMessageManager().reportException("User request failed");
		  wdComponentAPI.getMessageManager().raisePendingException();
	  } 
    //@@end
  }

The result of the call is

Warning: String request was successful

Error: User request failed

The Cardinalities are:

Request Cardinality : 1..1

Response Cardinality : 0..1

Return Cardinaliy : 1..1 (no value for the string, fixed for the user)

Former Member
0 Kudos

Hi,

The request has the cardinality 1..1, the response 0..1 and the return value 1..1.

From the explanation of the context it seems you need to change the return from 1..1 to 0..1. So that it can have a scenario where no elements exists.

Regards

Ayyapparaj

Former Member
0 Kudos

Thanks for the fast answers.

As i understand it, there is always a response, but not always a return value. The cardinality of the response node is fixed at 0..1, too. so there´s nothing to change. i can only change the cardinality of the request node.

former_member192434
Active Contributor
0 Kudos

Hi

if it is not always a returning value then try to put specefic check inside your code.

thanks

former_member192434
Active Contributor
0 Kudos

HI

Chnage the conext node cardinality 1:n or 0: n

thanks

Edited by: Anup Bharti on Oct 14, 2008 12:53 PM