Well, this should probably be asked on the Struts list. Here's what I
would suggest, though.
1. Do not extend a view-layer class in your domain. User and Role
should not extend any Struts-specific classes.
2. Create a new form bean class for this form called UserEdit or something.
3. Give it a read/write String[] property called roleNames:
public String[] getRoleNames()
{
// Cycle through the user's roles and build up an array to return.
}
public void setRoleNames( String[] roleNames )
{
// Do exactly what you were doing in your converter here and set
// the user's roles
}
Then, bind the "roleNames" property to your multibox (I assume that's
what you're using here). You can also make the user available as a
bean form property.
On 2/2/07, Abbas Adel <[EMAIL PROTECTED]> wrote:
Dears,
I have 2 hibernate entities, user & role, with many-to-many relation. I also
use them as form beans.
[code]
public class User extends ValidatorActionForm {
private int UID;
private String username;
private String password;
private String name;
private String email;
private Set roles;
.
}
public class Role extends ValidatorActionForm {
private int RID;
private String name;
private Set users;
.
}
[/code]
I created a simple Struts form to insert new user
[code]
<html:form action="/InsertUser" method="post">
Username: <html:text property="username" />
Password: <html:password property="password" />
Name: <html:text property="name" />
Email: <html:text property="email" />
Roles:
<html:select property="roles" multiple="true">
<html:optionsCollection name="roles" label="name"
value="RID" />
</html:select>
<html:submit/>
</html:form>
[/code]
When I run this form, struts complains [i]"argument type mismatch" [/i]
because it doesn't know how to convert the roles property, which is
String[], into java.util.Set
I had to write my own BeanUtil type convertor to convert from String[] to
java.util.Set.
[code]
public class RolesListConverter extends AbstractArrayConverter {
public Object convert(Class type, Object value) {
try {
List list = parseElements(value.toString());
String results[] = new String[list.size()];
Set results = new HashSet(list.size());
for (int i = 0; i < list.size(); i++) {
results[i] = (String) list.get(i);
results.add(Role (Integer.parseInt((String)list.get(i))));
}
return (results);
} catch (Exception e) {
if (useDefault) {
return (defaultValue);
} else {
throw new ConversionException(value.toString(), e);
}
}
}
}
[/code]
Then struts didn't complain but the roles Set was populated with 1 role only
regardless of how many roles were selected.
I gave a closer look at org.apache.commons.beanutils.BeanUtilsBean.java to
see how it works. I found this:
[code]
else if (type.isArray()) { // Indexed value into array
if (value instanceof String) {
newValue = getConvertUtils().convert((String) value,
type.getComponentType());
} else if (value instanceof String[]) {
newValue = getConvertUtils().convert(((String[]) value)[0],
type.getComponentType());
[/code]
Because java.util.Set is not an array "Set.class.isArray() return false"
then treat the "String[] value" as a single-value array "value[0]"
So, what do you suggest to force struts to convert String[] to Set?
Thanks in advance
BISO
Student @ Menufia University
org.apache.commons.beanutils.BeanUtilsBean.java
[code]
.
976
if (type.isArray() && (index < 0)) { // Scalar value into array
if (value == null) {
String values[] = new String[1];
values[0] = (String) value;
newValue = getConvertUtils().convert((String[]) values,
type);
} else if (value instanceof String) {
String values[] = new String[1];
values[0] = (String) value;
newValue = getConvertUtils().convert((String[]) values,
type);
} else if (value instanceof String[]) {
newValue = getConvertUtils().convert((String[]) value,
type);
} else {
newValue = value;
}
} else if (type.isArray()) { // Indexed value into array
if (value instanceof String) {
newValue = getConvertUtils().convert((String) value,
type.getComponentType());
} else if (value instanceof String[]) {
1004 newValue = getConvertUtils().convert(((String[])
value)[0], type.getComponentType());
} else {
newValue = value;
}
} else { // Value into scalar
if ((value instanceof String) || (value == null)) {
newValue = getConvertUtils().convert((String) value, type);
} else if (value instanceof String[]) {
newValue = getConvertUtils().convert(((String[]) value)[0],
type);
} else if (getConvertUtils().lookup(value.getClass()) != null) {
newValue = getConvertUtils().convert(value.toString(),type);
} else {
newValue = value;
}
}
.
[/code]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]