Spring MVC populate @RequestParam Map

后端 未结 4 1155
轻奢々
轻奢々 2020-12-19 01:58

I have the following method in my Spring MVC @Controller :

@RequestMapping(method = RequestMethod.GET)
public String testUrl(@RequestParam(value=\"test\") Ma         


        
相关标签:
4条回答
  • 2020-12-19 02:31

    You can create a new class that contains the map that should be populated by Spring and then use that class as a parameter of your @RequestMapping annotated method.

    In your example create a new class

    public static class Form {
       private Map<String, String> test;
       // getters and setters
    }
    

    Then you can use Form as a parameter in your method.

    @RequestMapping(method = RequestMethod.GET)
    public String testUrl(Form form) {
      // use values from form.getTest()
    }
    
    0 讨论(0)
  • 2020-12-19 02:38

    Spring doesn't have default conversion strategy from multiple parameters with the same name to HashMap. It can, however, convert them easily to List, array or Set.

    @RequestMapping(value = "/testset", method = RequestMethod.GET)
        public String testSet(@RequestParam(value = "test") Set<String> test) {
    
            return "success";
        }
    

    I tested with postman like http://localhost:8080/mappings/testset?test=ABC&test=DEF

    You will see set having data, [ABC, DEF]

    0 讨论(0)
  • 2020-12-19 02:46

    As detailed here https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestParam.html

    If the method parameter is Map or MultiValueMap and a parameter name is not specified, then the map parameter is populated with all request parameter names and values.

    So you would change your definition like this.

    @RequestMapping(method = RequestMethod.GET)
    public String testUrl(@RequestParam Map<String, String> parameters) 
    {   
      (...)
    }
    

    And in your parameters if you called the url http://myUrl?A=ABC&B=DEF

    You would have in your method

    parameters.get("A");
    parameters.get("B");
    
    0 讨论(0)
  • 2020-12-19 02:48

    Your question needs to be considered from different points of view.

    1. first part:

    as is mentioned in the title of the question, is how to have Map<String, String> as @RequestParam.

    Consider this endpoint:

    @GetMapping(value = "/map")
    public ResponseEntity getData(@RequestParam Map<String, String> allParams) {
        String str = Optional.ofNullable(allParams.get("first")).orElse(null);
        return ResponseEntity.ok(str);
    }
    

    you can call that via:

    http://<ip>:<port>/child/map?first=data1&second=data2
    

    then when you debug your code, you will get these values:

    > allParams (size = 2)
        > first = data1
        > second = data2
    

    and the response of the requested url will be data1.


    1. second part:

    as your requested url shows (you have also said that in other answers' comments) ,you need an array to be passed by url.

    consider this endpoint:

    public ResponseEntity<?> getData (@RequestParam("test") Long[] testId,
                                      @RequestParam("notTest") Long notTestId)
    

    to call this API and pass proper values, you need to pass parameters in this way:

    ?test=1&test=2&notTest=3
    

    all test values are reachable via test[0] or test[1] in your code.


    1. third part:

    have another look on requested url parameters, like: test[B]

    putting brackets (or [ ]) into url is not usually possible. you have to put equivalent ASCII code with % sign.

    for example [ is equal to %5B and ] is equal to %5D.

    as an example, test[0] would be test%5B0%5D.

    more ASCII codes on: https://ascii.cl/

    0 讨论(0)
提交回复
热议问题