2009-04-09 28 views
9

Lệnh biểu mẫu mùa xuân có thể là Bản đồ không? Tôi đã thực hiện lệnh của tôi một Bản đồ bằng cách mở rộng HashMap và tham chiếu các thuộc tính bằng cách sử dụng ký hiệu ['property'] nhưng nó không hoạt động.Lệnh dạng Spring có thể là Bản đồ không?

lệnh: hình thức

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

HTML:

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

Kết quả trong các lỗi:

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? 

Đây có phải là không được phép hoặc để tôi có cú pháp không chính xác?

Trả lời

11

Lệnh Springn MVC cần sử dụng các quy ước đặt tên JavaBeans (ví dụ: getXXX() và setXXX()) để bạn không thể sử dụng bản đồ cho điều đó.

Một thay thế là để có một bean với một ví dụ bất động sản Bản đồ duy nhất:

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

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

Sau đó, bạn có thể làm một cái gì đó như thế này (không chắc chắn 100% về cú pháp nhưng nó có thể):

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

Sintaxis của bạn là chính xác, nhưng thuộc tính bản đồ không thực sự bị ràng buộc. Vấn đề là mã được tạo ra giống như . Vì vậy, khi bạn gửi biểu mẫu này, không có gì đặt giá trị chính xác vào các thuộc tính. – sinuhepop

+0

Giá trị chuỗi bản đồ có thể được liên kết trong JSP. Các giá trị số nguyên của bản đồ/đối tượng có bị ràng buộc không? –

+0

Có vẻ như cú pháp hoạt động ngay bây giờ cho bản đồ, ít nhất là vào mùa xuân 3.0.7 – altumano

-1

Có thể nhưng ... Bạn cần tham khảo nó là <form:input path="name[index].key|value"/> ví dụ

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

+0

0 hoặc chỉ số cho là gì? –

1

Ok tôi có một giải pháp mà làm việc cho tôi tôi sử dụng MapUtils.lazyMap

// gốc miền của tôi

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

    } 

// domain thứ hai của tôi

public class AnotherDomainObj { 

    String propertyValue=""; 

     public String getPropertyValue() { 
      return propertyValue; 
     } 

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



} 

// Trong JSP

của tôi
<input type="text" value="testthis" name="templateMap['keyName'].propertyValue"/> 
+0

Giá trị chuỗi bản đồ có thể được liên kết trong JSP. Các giá trị số nguyên của bản đồ/đối tượng có bị ràng buộc không? –

3

Kết hợp câu trả lời của cletus và dbell tôi có thể thực sự làm cho nó hoạt động và muốn chia sẻ giải pháp với bạn (bao gồm cả liên kết của các giá trị khi nộp mẫu đơn, một lỗ hổng được báo cáo cho giải pháp cletus)

Bạn không thể sử dụng trực tiếp bản đồ dưới dạng lệnh, tuy nhiên có một đối tượng miền khác cần bọc một bản đồ lười biếng

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

} 

Cài đặtValue là một lớp thực sự kết thúc giá trị.

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

Phương pháp điều khiển cung cấp các mô hình trông như thế này:

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

Biểu mẫu của bạn sẽ trông như thế này

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

Các hình thức xử lý trình phương pháp điều khiển hoạt động như bình thường

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

Tôi đã xác minh bean SettingsInformation thực sự được lấp đầy với các giá trị trong biểu mẫu.

Cảm ơn vì đã giúp tôi với điều này; Nếu bạn có bất kỳ câu hỏi nào, hãy hỏi.

+0

Giá trị chuỗi bản đồ có thể được liên kết trong JSP. Các giá trị số nguyên của bản đồ/đối tượng có bị ràng buộc không? –

Các vấn đề liên quan