I have defined a simple POJO and type converter shown here:

// Model POJO
public class SiteSelection {
                private String type;
                private String label;
                private List<Long> ids = new ArrayList<Long>();
                /* getter & setters */
}

// Converter
public class SiteSelectionTypeConverter extends StrutsTypeConverter {
                @Override
                public Object convertFromString(Map context, String[] values, 
Class toClass) {
                                /* converts values[0] from 
'{type}:{comma-separted list of ids} */
                }
                @Override
                public String convertToString(Map context, Object object) {
                                /* converts object to string using format 
'{type}:{comma-separated list of ids} */
                }
}

// Action
public class SomeAction extends ActionSupport implements Preparable {
                private List<SiteSelection> siteSelections;
                private SiteSelection selectedSite;
                /* getter & setters */
}

In the JSP, I have used the select tag as follows

<s:select name="selectedSite" list="siteSelections" />

The type converters get used and the select is populated with the appropriate 
key/value pairs.   The problem is when I take a specific entry in the 
siteSelections and set it on the selectedSite property during the initial 
render or populate selectedSite and re-render the input page during say a 
validation failure, the select tag doesn't apply the "selected" attribute on 
any options.

This seems to be an issue with how parameters.nameValue is being determined in 
the taglib java code and the fact that the template compares this parameter 
against itemKey rather than itemKeyStr.  In the case of using type conversion, 
the itemKey is something like "com.app.SiteSelection@2b3a51e" where as 
itemKeyStr is "A:1,2,3".

Can someone explain to me what was the intended way to use TypeConverter 
implementations with a select tag?  The only way I've been able to hack around 
this issue is

<s:set var="selectedSiteStr" value="selectedSite" />
<s:select name="selectedSite" value="#selectedSiteStr" list="siteSelections" 
template="my-custom-select" />

and modifying the select.ftl line 107 from:

<#if tag.contains(parameters.nameValue, itemKey) == true>

To:

<#if tag.contains(parameters.nameValue, itemKeyStr) == true>

But I'm not sure what side effects such a change would have.

___________________________________________________________
Chris Cranford
SAP/Oracle/J2EE Applications Developer
SETECH Inc & Companies
903 Industrial Drive, Murfreesboro TN 37129
Phone: (615) 890-1755 x361, Fax: (615) 890-9057, Mobile: (704) 650-1042
Email: chris.cranf...@setech.com<mailto:chris.cranf...@setech.com>

Reply via email to