Problem is 99% solved by doing the following:
explicitelly added element convertor as Pete sugessted:
<h:selectManyListbox id="theList"
value="#{testAction.multiSelect}" >
| <s:selectItems value="#{testAction.allElements}"
var="element" label="#{element.name}" />
| <f:converter converterId="elementConvertor" />
| </h:selectManyListbox>
In param tag I called a convertor for the list parameter:
<?xml version="1.0" encoding="UTF-8"?>
| <page
xmlns="http://jboss.com/products/seam/pages"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xsi:schemaLocation="http://jboss.com/products/seam/pages
http://jboss.com/products/seam/pages-2.0.xsd">
| <param name="theList" converterId="elementListConvertor"
value="#{testAction.multiSelect}" />
| </page>
The convertor is implemented as below:
| @org.jboss.seam.annotations.faces.Converter
| @Name("elementListConvertor")
| public class ElementListParameterConvertor implements Converter, Serializable {
| @In
| private EntityManager entityManager;
|
| @Transactional
| public Object getAsObject(FacesContext context, UIComponent component, String value)
{
| if (value != null) {
| String[] allIds = value.split(" ");
| List<Element> theList = new ArrayList<Element>();
| for (int i = 0; i < allIds.length; i++) {
| String id = allIds;
| if (id == null || id.trim().length() == 0) continue;
| theList.add(findElement(id));
| }
| return theList;
| }
| return null;
| }
|
| private Element findElement(String id) {
| List<Element> allElements = TestAction.allElements;
| for (int i = 0; i < allElements.size(); i++) {
| if (allElements.get(i).getId().equals(new Integer(id))) return
allElements.get(i);
| }
| return null;
| }
|
| public String getAsString(FacesContext context, UIComponent component, Object value)
{
| if (value instanceof List) {
| List<Element> theList = (List<Element>) value;
| String s = "";
|
| for (Iterator iterator = theList.iterator(); iterator.hasNext();) {
| if (s.length() != 0) s += " ";
| Element element = (Element) iterator.next();
| s += element.id;
|
| }
| return s;
| }
| return null;
| }
|
| }
|
Having that done, all works (without need for any conversation propagation and so on).
Also if you call in the browser "localhost:8080/test/xList.seam?theList=1%202"
the entries in "select" are selected as expected.
The single point that does not work is the url when you submit the page:
- point the browser to "localhost:8080/test/xList.seam?theList=1%202"
- system shows first two entries in list selected (AS EXPECTED)
- select the third entry and press submit
- system update the browser location to "localhost:8080/test/xList.seam"
(WRONG, the correct is localhost:8080/test/xList.seam?theList=1%202%203)
For input Fields and selectOne, the system behaves as expected - parameter is
automatically added to the URL. The problem is specific to selectManyListbox component.
Additionally, if you have a :
<s:link view="/xList.xhtml"
| value="Test List"
| propagation="none"/>
the select multi parameter is not automatically added (while an input filed and selectOne
is).
Thanx again to Pete Muir for give me the valuable hints.
View the original post :
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4105957#...
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&a...