[SPRING] Spring 폼 명령을 Map으로 사용할 수 있습니까?
SPRINGSpring 폼 명령을 Map으로 사용할 수 있습니까?
Spring 폼 명령을 Map으로 사용할 수 있습니까? HashMap을 확장하여지도에 명령을 내리고 [property] 표기법을 사용하여 속성을 참조했지만 작동하지 않았습니다.
명령:
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?
이 허용되지 않습니까 또는 잘못된 구문이 있습니까?
해결법
-
==============================
1.스프링 MVC 명령은 JavaBeans 명명 규칙 (즉, getXXX () 및 setXXX ())을 사용해야하므로 맵을 사용할 수 없습니다.
스프링 MVC 명령은 JavaBeans 명명 규칙 (즉, getXXX () 및 setXXX ())을 사용해야하므로 맵을 사용할 수 없습니다.
하나의 대안은 단일 Map 프로퍼티로 bean을 가지는 것입니다 :
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']" />
-
==============================
2.cletus와 dbell의 답변을 결합하여 실제로 작동하게 만들었고 솔루션을 공유하고 싶습니다 (양식을 제출할 때 값 바인딩, cletus 솔루션에 대한 결함보고 포함)
cletus와 dbell의 답변을 결합하여 실제로 작동하게 만들었고 솔루션을 공유하고 싶습니다 (양식을 제출할 때 값 바인딩, cletus 솔루션에 대한 결함보고 포함)
직접지도를 명령으로 사용할 수는 없지만 게으른지도를 래핑해야하는 다른 도메인 개체가 있어야합니다.
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 Bean이 실제로 양식의 값으로 채워져 있는지 확인했습니다.
이걸 도와 주셔서 고맙습니다. 질문이 있으시면 언제든지 물어보십시오.
-
==============================
3.나는 MapUtils.lazyMap을 사용하는 솔루션을 가지고있다.
나는 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"/>
-
==============================
4.네, 그렇게 할 수 있습니다 ...
예 :네, 그렇게 할 수 있습니다 ...
예 :
from https://stackoverflow.com/questions/736186/can-a-spring-form-command-be-a-map by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] POST에서 빈 문자열을 제공하는 Spring @RequestBody (0) | 2019.02.18 |
---|---|
[SPRING] XML 대신 Java를 사용하여 Spring Boot에서 hbase를 사용하는 방법은 무엇입니까? (0) | 2019.02.18 |
[SPRING] 스프링 보안 permitAll은 토큰이 유효하지 않은 경우 승인 헤더에서 전달 된 토큰을 고려하고 401을 반환합니다. (0) | 2019.02.17 |
[SPRING] Spring - Autowire java.lang.NoClassDefFoundError (0) | 2019.02.17 |
[SPRING] 스캔으로 인한 부두 시동 지연 (0) | 2019.02.17 |