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]

Reply via email to