복붙노트

[SPRING] Spring 폼 명령을 Map으로 사용할 수 있습니까?

SPRING

Spring 폼 명령을 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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4.네, 그렇게 할 수 있습니다 ...
    예 :

    네, 그렇게 할 수 있습니다 ... 예 :

  5. from https://stackoverflow.com/questions/736186/can-a-spring-form-command-be-a-map by cc-by-sa and MIT license