2009-04-09 9 views
9

¿Puede un comando de forma de resorte ser un mapa? Hice mi comando un Mapa extendiendo HashMap y haciendo referencia a las propiedades usando la notación ['property'], pero no funcionó.¿Puede un comando de formulario de primavera ser un mapa?

Comando: forma

public class MyCommand extends HashMap<String, Object> { 
} 

HTML:

Name: <form:input path="['name']" /> 

produce el error:

org.springframework.beans.NotReadablePropertyException: Invalid property '[name]' of bean class [com.me.MyCommand]: Bean property '[name]' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter? 

Es ésta no permitidos o tengo una sintaxis incorrecta?

Respuesta

11

Springn Los comandos de MVC necesitan utilizar nombres de JavaBeans conventins (es decir, getXXX() y setXXX()) para que no pueda usar un mapa para eso.

Una alternativa es tener un grano con una sola, es decir la propiedad Mapa:

public class MyCommand { 
    private final Map<String, Object> properties = new HashMap<String, Object>(); 

    public Map<String, Object> getProperties() { return properties; } 
    // setter optional 
} 

entonces usted puede hacer algo como esto (no 100% seguro de la sintaxis, pero es posible):

Name: <form:input path="properties['name']" /> 
+1

Su sintaxis es correcta, pero las propiedades del mapa no se unen realmente. El problema es que el código generado es algo así como . Entonces, cuando envía este formulario, nada pone el valor correcto en las propiedades. – sinuhepop

+0

Los valores de cadena de mapa pueden vincularse en JSP. ¿Pueden enlazarse los valores enteros del mapa/objeto? –

+0

Parece que la sintaxis funciona ahora para los mapas, al menos en Spring 3.0.7 – altumano

-1

Sí, puede pero ... Debe referenciarlo como <form:input path="name[index].key|value"/> por ej.

<form:input path="name[0].value"/>

+0

¿Para qué sirve el 0? –

1

Ok tengo una solución que funciona para mí yo uso MapUtils.lazyMap

// Mi dominio raíz

public class StandardDomain { 

     private Map<String, AnotherDomainObj> templateMap= MapUtils.lazyMap(new HashMap<String, AnotherDomainObj>(),FactoryUtils.instantiateFactory(AnotherDomainObj.class)); 

     public Map<String, AnotherDomainObj> getTemplateContentMap() { 
      return templateMap; 
     } 

     public void setTemplateContentMap(Map<String, AnotherDomainObj > templateMap) { 
      templateMap = templateMap; 
     } 

    } 

// mi segundo dominio

public class AnotherDomainObj { 

    String propertyValue=""; 

     public String getPropertyValue() { 
      return propertyValue; 
     } 

     public void setPropertyValue(String propertyValue) { 
      this.propertyValue = propertyValue; 
    } 



} 

// En mi JSP

<input type="text" value="testthis" name="templateMap['keyName'].propertyValue"/> 
+0

Los valores de cadena de mapa pueden vincularse en JSP. ¿Pueden enlazarse los valores enteros del mapa/objeto? –

3

Combinando la respuesta de Cletus y dbell que en realidad podría hacer que funcione y le gustaría compartir la solución con usted (incluyendo la unión de los valores al presentar el formulario, un defecto reportado para la solución de Cletus)

No se puede utilizar directamente como un mapa de comandos, sin embargo tener otro objeto de dominio que necesita para envolver un mapa perezoso

public class SettingsInformation { 

    private Map<String, SettingsValue> settingsMap= MapUtils.lazyMap(new HashMap<String, SettingsValue>(),FactoryUtils.instantiateFactory(SettingsValue.class)); 

    public Map<String, SettingsValue> getSettingsMap() { 
     return settingsMap; 
    } 

    public void setSettingsMap(Map<String, SettingsValue > settingsMap) { 
     this.settingsMap = settingsMap; 
    } 

} 

SettingsValue es una clase que en realidad se ajusta el valor.

public class SettingsValue { 

private String value; 

public SettingsValue(String value) { 
    this.value = value; 
} 


public SettingsValue() { 

} 

public String getValue() { 

    return value; 
} 

public void setValue(String propertyValue) { 

    this.value = propertyValue; 
} 

El método controlador que proporciona el modelo se parece a esto:

@RequestMapping(value="/settings", method=RequestMethod.GET) 
public ModelAndView showSettings() { 

    ModelAndView modelAndView = new ModelAndView("settings"); 

    SettingsDTO settingsDTO = settingsService.getSettings(); 
    Map<String, String> settings = settingsDTO.getSettings(); 

    SettingsInformation settingsInformation = new SettingsInformation(); 

    for (Entry<String, String> settingsEntry : settings.entrySet()) { 
     SettingsValue settingsValue = new SettingsValue(settingsEntry.getValue()); 
     settingsInformation.getSettingsMap().put(settingsEntry.getKey(), settingsValue); 
    } 

    modelAndView.addObject("settings", settingsInformation); 

    return modelAndView; 
} 

Su forma debe tener este aspecto

<form:form action="${actionUrl}" commandName="settings"> 
     <form:input path="settingsMap['exampleKey'].value"/> 
     <input type="submit" value="<fmt:message key="settings.save"/>"/> 
</form:form> 

La forma de manipulación presentación método regulador funciona como de costumbre

@RequestMapping(value="/settings", method=RequestMethod.POST) 
public ModelAndView updateSettings(@ModelAttribute(value="settings") SettingsInformation settings) { 
[...] 
} 

Comprobé que el bean SettingsInformation está realmente lleno con los valores en el formulario.

Gracias por ayudarme con este; Si usted tiene alguna pregunta no dude en preguntar.

+0

Los valores de cadena de mapa pueden vincularse en JSP. ¿Pueden enlazarse los valores enteros del mapa/objeto? –

Cuestiones relacionadas