Tuesday, April 21, 2009

Unexpected null value for literal data

: ) my first post on web services. I faced this issue in Jdeveloper 10g.
Some times we developer’s faces an error during our developed, which irritates like anything. This will keep coming in office and in dreamsJ. For me the culprit was “unexpected null value for literal data”. You might be facing this error when you are sending request using web service proxy to server to perform some operation on the web service in question. This problem is not at the server side, but is thrown at the client side, when you are not setting the request fields to the web service.
Now the question is how you can identify that which fields are required for the web service. The answer is in the WSDL using which you have generated the web proxy. Open your WSDL and check against each element the value for the attribute minOccur. If it is equal to one, it means that element is mandatory. If minOccur is zero, it means is an optional element. And if minOccur attribute is missing, it will take the default value equal to “1” which means it’s mandatory.

If you have fairly large WSDL and its difficult to identify and set the values, just go ahead and change your WSDL with all elements attribute property minOccur set to “0”.

Sunday, March 8, 2009

Oracle ADF 11g Tutorial Application

ADF 11g is simply great. Though there are many documents provided my oracle for learning ADF 11g. But still I felt there are are need for more documents. So when I started learning ADF 11g, I decided to build the sample application and document it. And finally this weekend I got some time to finish up this document. Following is the link from where you can view/download the document.

http://www.scribd.com/doc/13088674/Oracle-ADF-11g-Learning-Application-My-Procurement-Application

And following is the link for the sample application which I developed. This also includes the SQL script required to install the database objects.

MyADFLearningApp.zip

Hope you'll find it helpfull. Do let me know of any error's/suggestions to improve the doument.

Tuesday, December 23, 2008

Learning ADF

Now days I am learning ADF 11g and working on a sample example in Jdev 11g. For developers like me who had and still working on Oracle OAF and Oracle apps and what to learn ADF, it is very imporatnt to learn basic java, J2EE concepts as well as understanding XML and JSF concepts. Here are few links that I found usefull for learning these:-

--> Basic java -
http://java.sun.com/docs/books/tutorial/java/index.html
--> J2EE -
http://www.amazon.com/Certified-Component-Developer-Study-Companion/dp/0955160316
--> JSF -
http://www.javapassion.com/j2ee/JSFBasics_speakernoted.pdf
--> XML concepts -
http://www.w3schools.com/xml/default.asp

I will be posting my ADF 11g learning application by next year.

Happy Learning.

Tuesday, October 14, 2008

Call method on page load in ADF

call method on page load in ADF – [JDeveloper Version 10.1.3]

In this example we will see how we can call a method inside your backing bean or application module when page is getting loaded.
The scenario I am taking here is you have to show the current row index of the view object row on page load in ADF table column.
1) Create a view object based on Job table in HR schema with name OnPageLoadJobVO. Do generate the VOImpl and VORowImpl java classes for the created view object.



2) Add a transient variable inside your view object with name
“myCurrentRowIndex”



3) Add the above created view Object inside your application module.
4) Add the following code inside your application module Impl class.

public void setJobCurrentRowIndex() {
System.out.println("I am here inside AM");
OnPageLoadJobVOImpl vo = getOnPageLoadJobVO1();
OnPageLoadJobVORowImpl row=null;
long fetchedRowCount = vo.getEstimatedRowCount();
RowSetIterator jobVoIter = vo.createRowSetIterator("jobVoIter");
if (fetchedRowCount > 0)
{
jobVoIter.setRangeStart(0);
jobVoIter.setRangeSize((int)fetchedRowCount);
for (int count = 0; count < fetchedRowCount; count++)
{
row=(OnPageLoadJobVORowImpl)jobVoIter.getRowAtRangeIndex(count);
row.setmyCurrentRowIndex(new Number(count));
}
}
jobVoIter.closeRowSetIterator();
}

5) Expose the above created method in application module to the client.
6) Drag and drop the OnPageLoadJobVO object to your jspx page as ADF read only table.
7) Create a new Managed bean using faces-config.xml with
name= OnPageLoadBackingBean and

class= OnPageLoadBean

8) Copy and paste the following code inside your newly created managed bean class.

package viewlayer.backing;
import javax.faces.application.Application;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;
import model.common.AppModule;
import oracle.adf.controller.v2.lifecycle.Lifecycle;
import oracle.adf.controller.v2.lifecycle.PagePhaseEvent;
import oracle.adf.controller.v2.lifecycle.PagePhaseListener;


public class OnPageLoadBean implements PagePhaseListener{
public OnPageLoadBean() {
}
public void afterPhase(PagePhaseEvent event) {
}
public void beforePhase(PagePhaseEvent event) {
if (event.getPhaseId() == Lifecycle.PREPARE_MODEL_ID) {
if (!isPostback())
/*
System.out.println("i am here inside backing bean");
this.getApplicationModule().setJobCurrentRowIndex();
}
}
private boolean isPostback() {
return Boolean.TRUE.equals(resolveExpression("#{adfFacesContext.postback}"));
}
private Object resolveExpression(String expression) {
FacesContext ctx = FacesContext.getCurrentInstance();
Application app = ctx.getApplication();
ValueBinding bind = app.createValueBinding(expression);
return bind.getValue(ctx);
}
private AppModule getApplicationModule() {
return (AppModule)resolveExpression ("#data.AppModuleDataControl.dataProvider}");
}
}
9) Right click on your jspx page and go to your page definition. Where set the attribute ControllerClass inside your pageDefinition tag as the name of the managed bean.


Run your page to check the results.

Add new row in ADF table on button click

Add new row in ADF table on button click – [JDeveloper Version 10.1.3]
In this example we will add a new row at last position in an ADF table. I am taking an example of Employee table in HR schema. We need this approach if we want to create an empty row in ADF table and then initialize it with some values or to add the empty row at the end of the table.

Step 1) Create a new Employee View Object(say EmpViewObjEOBased) based on an Employee Entity object.

Step 2) Add the above view object in your application module.

Step 3) Drop it on your page as a ADF table (not as ADF readonly table).

Step 4) Add the following code inside your application module class.


public void createRow() {
Row newRow = getEmpViewObjEOBased1().createRow();
newRow.setNewRowState(Row.STATUS_INITIALIZED);
//get instance of the above created view object
ViewObjectImpl vo=getEmpViewObjEOBased1();
// to insert row at the end of the table
vo.insertRowAtRangeIndex(vo.getRangeSize()-1,newRow);
System.out.println(getEmpViewObjEOBased1().getCurrentRowIndex());
}

If you want to insert the row at the begening of the table replace line vo.insertRowAtRangeIndex(vo.getRangeSize()-1,newRow); with
vo.insertRow(newRow);

Step 5) Expose this application module method to client.




This will expose the method to be used in UI and method will appear in the data control.

Step 6) Drop the createRow button inside the “Table facets->action” as a ADF command button.


Now run your page and check the result...

Wednesday, October 8, 2008

Jdeveloper 11g production

Finally after much of wait , Jdeveloper 11g productions is released and is
Ready for download.
http://www.oracle.com/technology/software/products/jdev/htdocs/soft11.html .

JDeveloper 11g — Online Demonstrations

http://www.oracle.com/technology/products/jdev/viewlets/11/index.html

Documentation and Developer guide

http://download.oracle.com/docs/cd/E12839_01/index.htm

Important code samples commonly used in ADF

In this post I am listing up important code samples commonly used in ADF .

Code to access the application module methods from the managed bean

To make sure that your application module method is accessible from the view layer, in the application module editor, do shift the method from “Avaliable” to “Selected List” under the client interface option.

FacesContext fc = FacesContext.getCurrentInstance();
ValueBinding vb = fc.getApplication().createValueBinding("#{data}");
BindingContext bc = (BindingContext)vb.getValue(fc);
DCDataControl dc = bc.findDataControl("HRAppModuleDataControl");
ApplicationModule am = (ApplicationModule)dc.getDataProvider();
HRAppModule hrAm = (HRAppModule)am;
hrAm.setCurrentEmpRow(empId1);

In the above example HRAppModuleDataControl is the Data control used in your application.You can find the exact name used in your application in the DataBindings.cpx file inside the .HRAppModule is the Application module client interface class. And setCurrentEmpRow is the method inside the Applicatin module which is need to be called.

Code to access the page bindings from the Managed bean

DCBindingContainer bc1 = this.getBindings();
String empId1 = bc1.findIteratorBinding("EmpDeptTableIterator").
getCurrentRow().getAttribute("EmployeeId").toString();

In the above example EmpDeptTableIterator is the iterator name from which I want to access the EmployeeId.

In the above example getBinding() refers to the method which returns the object of type DCBindingContainer. If its not already there, add the following code snippet to your same managed bean.

private DCBindingContainer bindings;
public DCBindingContainer getBindings()
{ return bindings;
}
public void setBindings(DCBindingContainer bindings)
{ this.bindings = bindings; }

An inside your faces-config.xml add the following managed property inside your managed bean.
<managed-property>
<property-name>bindings</property-name>
<property-class>oracle.adf.model.binding.DCBindingContainer</property-class>
<value>#{bindings}</value>
</managed-property>