복붙노트

[SPRING] 지도 <String, String>을 스프링 MVC 컨트롤러에 전달

SPRING

지도 을 스프링 MVC 컨트롤러에 전달

HashMap 또는 다른 Map 구현을 ajax에서 Spring MVC 컨트롤러로 보내려고합니다.

내가하는 일의 세부 사항은 다음과 같습니다.

Ajax 호출은 다음과 같다.

var tags = {};
tags["foo"] = "bar";
tags["whee"] = "whizzz";


$.post("doTestMap.do",   {"tags" : tags }, function(data, textStatus, jqXHR) {
if (textStatus == 'success') {
    //handle success
    console.log("doTest returned " + data);
} else {
    console.err("doTest returned " + data);
}
}); 

다음 컨트롤러 측면에서 내가 가진 :

@RequestMapping(value="/publisher/doTestMap.do", method=RequestMethod.POST)
public @ResponseBody String doTestMap(@RequestParam(value = "tags", defaultValue = "") HashMap<String,String> tags, HttpServletRequest request) {  //

    System.out.println(tags);

    return "cool";
} 

불행히도 나는 체계적으로

org.springframework.beans.ConversionNotSupportedException: Failed to convert value of type 'java.lang.String' to required type 'java.util.Map'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [java.util.Map]: no matching editors or conversion strategy found

내가 뭘 잘못하고 있죠 ?

고맙습니다.

해결법

  1. ==============================

    1.스프링 컨트롤러에서 맵을 바인딩하는 것은 배열을 바인딩하는 것과 같은 방법으로 지원됩니다. 특별한 컨버터가 필요하지 않습니다!

    스프링 컨트롤러에서 맵을 바인딩하는 것은 배열을 바인딩하는 것과 같은 방법으로 지원됩니다. 특별한 컨버터가 필요하지 않습니다!

    명심할 것은 한가지 있습니다 :

    따라서 필요한 태그 라 불리는 Map 유형의 필드를 보유하는 래퍼 클래스 (TagsWrapper) 만 있으면됩니다. 배열을 바인딩하는 것과 동일한 접근 방식.

    이것은 꽤 잘 문서에 설명되어 있지만 나는 잠시 동안 래퍼 개체의 필요성을 잊지 보관;)

    두 번째로 변경해야 할 것은 태그 값을 제출하는 방법입니다.

    tags가 랩퍼의 맵이면 양식 제출을 위해 즉시 작동합니다.

  2. ==============================

    2.마틴 프라이 (Martin Frey)의 도움에 따른 코드로 완성 된 해답은 다음과 같습니다.

    마틴 프라이 (Martin Frey)의 도움에 따른 코드로 완성 된 해답은 다음과 같습니다.

    자바 스크립트 측면 (태그 값이 채워지는 방식에 유의하십시오.)

    var data = {
       "tags[foo]" : "foovalue", 
       "tags[whizz]" : "whizzvalue" 
    }
    
    $.post("doTestMap.do",   data , function(data, textStatus, jqXHR) {
        ...
    }); 
    

    그리고 컨트롤러 측에서 :

    @RequestMapping(value="/publisher/doTestMap.do", method=RequestMethod.POST)
    public @ResponseBody String doTestMap(@ModelAttribute MyWrapper wrapper, HttpServletRequest request) {
    } 
    

    그 안에 Map을 사용하여 래퍼 클래스를 만듭니다.

    class MyWrapper {
    
        Map<String,String> tags;
    
       +getters and setters
    
    }
    

    그런 다음지도를 적절하게 채울 수 있습니다.

  3. ==============================

    3.응답이 늦을 수 있습니다. 그러나 누군가를 도울 수 있습니다. 나는 비슷한 문제를 겪었고 이것이 내가 고쳐 놓은 방법이다. JS : 내지도는 비슷해 보입니다.

    응답이 늦을 수 있습니다. 그러나 누군가를 도울 수 있습니다. 나는 비슷한 문제를 겪었고 이것이 내가 고쳐 놓은 방법이다. JS : 내지도는 비슷해 보입니다.

    var values = {};
    values[element.id] = element.value;
    

    Ajax :

            $.ajax({
                type : 'POST',
                url : 'xxx.mvc',
                data : JSON.stringify(values),              
                error : function(response) {
                    alert("Operation failed.");
                },
                success : function(response) {
                    alert("Success");
                },
                contentType : "application/json",
                dataType : "json"
            });
    

    제어 장치:

    @RequestMapping(value = "/xxx.mvc", method=RequestMethod.POST)
        @ResponseBody
        public Map<String, Object> getValues(@RequestBody Map<String, Object> pvmValues, final HttpServletRequest request, final HttpServletResponse response) {
    System.out.println(pvmValues.get("key"));
    }
    
  4. ==============================

    4.기본적으로 javascript 배열 태그를 보내고 있습니다.이 배열 태그는 기본적으로 jQuery에 의해 tags []라는 매개 변수로 URL로 인코딩됩니다. 이것이 당신이 원하는 것인지 확실하지 않습니다.

    기본적으로 javascript 배열 태그를 보내고 있습니다.이 배열 태그는 기본적으로 jQuery에 의해 tags []라는 매개 변수로 URL로 인코딩됩니다. 이것이 당신이 원하는 것인지 확실하지 않습니다.

    봄에는 HashMap과 같은 이름의 여러 매개 변수에서 기본 변환 전략이 없으므로 오류가 발생합니다. 그러나 목록, 배열 또는 집합으로 쉽게 변환 할 수 있습니다.

    그래서 이것을 시험해보십시오.

    @RequestMapping(value="/publisher/doTestMap.do", method=RequestMethod.POST)
    public @ResponseBody String doTestMap(@RequestParam(value = "tags[]") Set<String> tags, HttpServletRequest request) {  //
    
        System.out.println(tags); //this probably won't print what you want
    
        return "cool";
    } 
    
  5. ==============================

    5.이 작업을 수행하는 가장 좋은 방법은 JSON을 사용하여 객체를 인코딩하고이를 디코딩하는 것입니다.

    이 작업을 수행하는 가장 좋은 방법은 JSON을 사용하여 객체를 인코딩하고이를 디코딩하는 것입니다.

    두 개의 라이브러리가 필요합니다. 클라이언트 측에서는 json2.js가 필요합니다. 일부 브라우저는 지금까지 이것을 기본적으로 수행하는 것으로 보입니다. 그러나 이것을 갖는 것이 더 안전한 방법입니다.

    서버에서 잭슨이 필요합니다.

    클라이언트에서지도를 인코딩하고이를 매개 변수로 전달합니다.

    var myEncodedObject = JSON.stringify(tags);
    

    서버에서 매개 변수를 문자열로 받고 디코드합니다.

    ObjectMapper myMapper = new ObjectMapper();
    Map<String, Object> myMap = myMapper.readValue(tags, new TypeReference<Map<String, Object>>);
    

    Spring에서 자동으로 변환 할 수있는 방법이있을 수 있지만 이것이 그 요지입니다.

  6. from https://stackoverflow.com/questions/18280395/passing-a-mapstring-string-to-a-springmvc-controller by cc-by-sa and MIT license