Skip to main content

ADF Defaulting a backing bean driven select: Thing I learned being stupid 1

Jdeveloper 11.1.1.5

Ok,

I had a selectonechoice that was driven by a pojo data control and I just couldn't get its value defaulted.
The following is what I learned along the way and my unique solution:

Drag and drop the item onto the page as a single choice selectonechoice:
Add a variable to your page binding (open your page and click on the bindings tab - right click on variables under Executables - insert inside variables - select variable - Name:selectedItemValue Type: java.lang.Object

Then click on Page definition file and update the variable you just added and add these attributes DefaultValue="#{pageFlowScope.TestBean.id}" IsUpdateable="2".
NOTE: the bold bit pageFlowScope.TestBean.id must be the value you want to default to.

Or you can just paste the xml like such:



<variable Type="java.lang.Integer" Name="selectedItemValue" DefaultValue="#{pageFlowScope.TestBean.id}" IsUpdateable="2" />


Then update your list binding to something like this (you can get this done using the green plus button but I am too lazy to post how if you need to know ask):


    <list StaticList="false" IterBinding="variables"
          ListIter="listItemsIterator" NullValueFlag="start" id="selectedItemValueList">
      <AttrNames>
        <Item Value="selectedItemValue"/>
      </AttrNames>
      <ListAttrNames>
        <Item Value="id"/>
      </ListAttrNames>
      <ListDisplayAttrNames>
        <<tem Value="name"/>
      </ListDisplayAttrNames>
    </list>

NullValueFlag="start" - gives you an empty item

This be my select one choice.
          <af:selectOneChoice value="#{bindings.selectedItemValueList.inputValue}"
                              label="#{bindings.selectedItemValueList.label}"
                              id="soc1"
                              valuePassThru="true" autoSubmit="true"
                              clientComponent="true">
            <f:selectItems value="#{bindings.selectedItemValueList.items}" id="siI"/>
          </af:selectOneChoice>



Handy helpful EL:

1) #{bindings.selectedItemValueList.attribute} - this will give you the actual id of the select box selected item
2) #{bindings.selectedItemValueList.inputValue} = this will give you the index 0 based of the selected item
3) #{bindings.selectedItemValueList.selectedValue == null ? null : bindings.selectedItemValueList.selectedValue.dataProvider} - this gives you the actual underlying object used so you can get the label from here.

Save Button
The save button I use because I need the object not just the object id



            <af:setPropertyListener from="#{bindings.selectedItemValueList.selectedValue == null ? null : bindings. selectedItemValueList .selectedValue.dataProvider}"
                                    to="#{pageFlowScope.listBean.currentValue.selectedItem}"
                                    type="action"/>
          </af:commandButton>




Random code

        Object expr = JsfUtil.resolveELExpression("#{bindings.selectedItemValueList}");
        if (expr instanceof FacesCtrlListBinding) {
            FacesCtrlListBinding list = (FacesCtrlListBinding)expr;
            UIComponent component = valueChangeEvent.getComponent();
            component.processUpdates(FacesContext.getCurrentInstance()); //do model updates for this comp
            DCDataRow row = (DCDataRow)list.getSelectedValue();
            ListItem i = (ListItem)().getDataProvider(); // get actual object via code
        }


Note
Create a list and change the binding xml for your list (ListOperMode attribute) from navigation to  setAttribute and see hoe things change

Comments

Popular posts from this blog

MANIFEST.MF merge JDeveloper for an executable jar

Goto your project > properties. Then click on deployment in the menu. Edit or add a jar deployment profile. Fill in the details under jar options (select Include manifest and give it a main class name) Also remember that the merge functionality only works with a BLANK line at the end of the merge file. REALLY this caught me. My merge file contents: Class-Path: commons-codec-1.3.jar [...empty line here CRLF...]

JBO-25013: TooManyObjectsException

oracle.jbo.TooManyObjectsException: JBO-25013: Too many objects match the primary key oracle.jbo.Key[Key null ]. Ok so for you it may be trying to insert a duplicate record this should explain your problem (also check trigger they could be the cause.) NOTE: You can also try to create a new duplicate EO if you have a page with two VO's using the same EO. This could sort your problems. For me I needed to add a launch listener on my LOV and clear the cache of my vo. LOV <af:inputListOfValues id="NameId" popupTitle="#{bindings.Name.hints.label}" value="#{bindings.RolName1.inputValue}" label="#{bindings.RolName1.hints.label}" model="#{bindings.RolName1.listOfValuesModel}" required="#{bindings.RolName1.hints.mandatory}" columns="#{bindings.RolName1.hints.displayWidth}" shortDesc="#{bindings.RolName1.hints.tooltip}" launchPopupListener="#{backingBeanScope.backingBean.launchPop...

ADF Encountered deferred syntax #{ in template text.

OracleJSP error: oracle.jsp.parse.JspParseException:  Error: Encountered deferred syntax #{ in template text.  If intended as a literal, escape it or set directive  deferredSyntaxAllowedAsLiteral This normally happens when you have some tag lib dependancy problems but this was  not the case for me... My problem: For some reason my model project had web stuff in it(public html etc)  so I had to remove the public html stuff from my project and manually edit the Model.jpr project file and remove the tag lib entries at the bottom o the file. Go figure.