2009-04-09 2 views
9

Может ли команда формы весны быть Картой? Я сделал команду Map, расширив HashMap и ссылаясь на свойства, используя нотацию ['property'], но это не сработало.Может ли команда Spring form быть Картой?

Команда:

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

HTML форма:

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

Результаты в погрешности:

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? 

Является ли это не разрешено или у меня неправильный синтаксис?

ответ

11

Командам Springn MVC необходимо использовать имена именования JavaBeans (т.е. getXXX() и setXXX()), поэтому вы не можете использовать карту для этого.

Одна альтернатива иметь боб с одним, т.е. на карте недвижимости:

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

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

Затем вы можете сделать что-то вроде этого (не на 100% уверен в синтаксисе, но это возможно):

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

Ваш синтаксис верен, но свойства карты не связаны фактически. Проблема заключается в том, что сгенерированный код представляет собой нечто вроде . Итак, когда вы отправляете эту форму, ничто не помещает правильное значение в свойства. – sinuhepop

+0

Карта Значения строк могут быть связаны в JSP. Можно ли привязать целочисленные значения объекта map/object? –

+0

Похож на синтаксис теперь работает для карт, по крайней мере весной 3.0.7 – altumano

-1

Да, это может быть ... Вам необходимо указать его как <form:input path="name[index].key|value"/> eg

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

+0

Для чего нужен 0 или индекс? –

1

Хорошо у меня есть решение, которое работает для меня я использую MapUtils.lazyMap

// Мой Корневой домен

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; 
     } 

    } 

// мой второй домен

public class AnotherDomainObj { 

    String propertyValue=""; 

     public String getPropertyValue() { 
      return propertyValue; 
     } 

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



} 

// В моем JSP

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

Карта Значения строк могут быть связаны в JSP. Можно ли привязать целочисленные значения объекта map/object? –

3

Комбинируя ответ Клетуса и dbell я мог заставить его работать, и хотел бы поделиться решением с вами (включая связывание значений при отправке формы, изъян сообщалось Клетуса раствора)

Вы не можете непосредственно использовать карту в качестве команды, однако есть другой объект домена, который необходимо обернуть ленивый Map

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 это класс, который на самом деле обертывание значения.

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; 
} 

Метод контроллер, обеспечивающий модель выглядит следующим образом:

@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; 
} 

Ваша форма должна выглядеть следующим образом

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

Способ управления формой обработки представления работает как обычно

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

Я проверил, что компонент SettingsInformation фактически заполнен значениями в форме.

Спасибо, что помогли мне с этим; Если у вас есть вопросы, не стесняйтесь спросить.

+0

Карта Значения строк могут быть связаны в JSP. Можно ли привязать целочисленные значения объекта map/object? –

Смежные вопросы