programing

스프링 MVC 채우기 @RequestParamMap

cafebook 2023. 8. 1. 20:47
반응형

스프링 MVC 채우기 @RequestParamMap

Spring MVC @Controller에 다음 방법이 있습니다.

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

저는 이렇게 부릅니다.

http://myUrl?test[A]=ABC&test[B]=DEF

그러나 "test" RequestParam 변수는 항상 null입니다.

"테스트" 변수를 채우려면 어떻게 해야 합니까?

자세한 내용은 여기 https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestParam.html 에서 확인하십시오.

메서드 매개 변수가 Map 또는 MultiValueMap이고 매개 변수 이름이 지정되지 않은 경우 모든 요청 매개 변수 이름과 값이 맵 매개 변수에 채워집니다.

그래서 여러분은 이렇게 정의를 바꿀 것입니다.

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

그리고 url http://myUrl?A=DEP&B=DEF를 호출한 경우 매개 변수에 표시됩니다.

당신은 당신의 방법으로

parameters.get("A");
parameters.get("B");

Spring에 의해 채워져야 하는 지도를 포함하는 새로운 클래스를 만들고 그 클래스를 사용할 수 있습니다.@RequestMapping주석이 달린 방법

예제에서는 새 클래스를 만듭니다.

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

그러면 사용할 수 있습니다.Form매개 변수로 사용할 수 있습니다.

@RequestMapping(method = RequestMethod.GET)
public String testUrl(Form form) {
  // use values from form.getTest()
}

Spring에는 동일한 이름을 가진 여러 매개 변수에서 HashMap으로 기본 변환 전략이 없습니다.그러나 목록, 배열 또는 집합으로 쉽게 변환할 수 있습니다.

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

        return "success";
    }

나는 우체부와 같이 테스트를 했습니다.http://localhost:8080/mappings/testset?test=ABC&test=DEF

[ABC, DEF] 데이터가 있는 세트가 표시됩니다.

당신의 질문은 다른 관점에서 고려될 필요가 있습니다.

  1. 첫 번째 부분:

질문의 제목에 언급된 것처럼, 어떻게 가지고 있는가 하는 것입니다.Map<String, String>~하듯이@RequestParam.

이 끝점을 고려합니다.

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

다음을 통해 전화할 수 있습니다.

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

코드를 디버깅하면 다음 값을 얻을 수 있습니다.

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

그리고 요청된 URL의 응답은 다음과 같습니다.data1.


  1. 두 번째 부분:

당신의 요청된 URL이 보여주듯이 (다른 답변의 코멘트에서 당신은 또한 말했습니다), 당신은 필요합니다.arrayurl로 전달됩니다.

이 끝점을 고려합니다.

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

이 API를 호출하고 적절한 값을 전달하려면 다음과 같은 방법으로 매개 변수를 전달해야 합니다.

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

모든.test값은 다음을 통해 도달할 수 있습니다.test[0]또는test[1]당신의 코드로.


  1. 세 번째 부분:

다음과 같은 요청된 URL 매개 변수를 다시 확인합니다.test[B]

놓는 것brackets(또는)[ ])를 url로 변환하는 것은 일반적으로 불가능합니다.당신은 동등한 것을 넣어야 합니다.ASCII와 코드를 맞추다.%서명하다.

예를들면[와 같음%5B그리고.]와 같음%5D.

예를 들어,test[0]되지요test%5B0%5D.

ASCII코드: https://ascii.cl/

저는 클라이언트가 변수 매개 변수의 두 그룹을 보내는 비슷한 상황에 직면했습니다.이 그룹들을 부르자.foo그리고.bar요청은 다음과 같습니다.

GET /search?page=2&size=10&foo[x]=aaa&foo[y]=bbb&bar[z]=ccc

저는 이 매개변수들을 두 개의 다른 지도에 매핑하고 싶었습니다.다음과 같은 것:

@GetMapping("/search")
public Page<...> search(Pageable pageable,
        @RequestParam(...) Map<String, String> foo,
        @RequestParam(...) Map<String, String> bar) {
    ...
}

@RequestParam저한테도 안 통했어요대신 두 개의 유형 필드가 있는 모델 클래스를 만들었습니다.Map<> 변수 이름 조 매 변 이 름 일foo그리고.bar(@Data이라lombok.Data).

@Data
public static class FooBar {
    Map<String, String> foo;
    Map<String, String> bar;
}

컨트롤러 코드가 다음으로 변경되었습니다.

@GetMapping("/search")
public Page<...> search(Pageable pageable, FooBar fooBar) {
    ...
}

GET /search?page=2&size=10&foo[x]=aaa&foo[y]=bbb&bar[z]=ccc봄은 지도를 인스턴스화하고 채웠습니다.fooBar.getFoo() 열값/이있는쇠 ▁keys▁withx/aaa그리고.y/bbb그리고.fooBar.getBar()와 함께z/ccc.

MultiValueMap을 사용할 수 있습니다.

다중값 맵<문자열, 문자열>

@RequestMapping(method = RequestMethod.GET)
public String testUrl(@RequestParam(value="test") MultiValueMap<String, String> test) {   
    (...)
}

테스트 중에는 테스트[A], 테스트[B]를 사용하지 않습니다.아래와 같이 사용하시면 됩니다.

http://myUrl?test=ABC&test=DEF

테스트 결과는 인쇄 시 아래 형식으로 표시됩니다.

테스트 = {[ABC, DEF]}

언급URL : https://stackoverflow.com/questions/47418489/spring-mvc-populate-requestparam-mapstring-string

반응형