@RequestParam에서 목록 바인딩


127

이런 식으로 양식에서 몇 가지 매개 변수를 보냅니다.

myparam[0]     : 'myValue1'
myparam[1]     : 'myValue2'
myparam[2]     : 'myValue3'
otherParam     : 'otherValue'
anotherParam   : 'anotherValue' 
...

다음과 같은 매개 변수를 추가하여 컨트롤러 메서드의 모든 매개 변수를 가져올 수 있음을 알고 있습니다.

public String controllerMethod(@RequestParam Map<String, String> params){
    ....
}

매개 변수 myParam [] (다른 것 아님)을 목록이나 배열 (인덱스 순서를 유지하는 모든 것)에 바인딩하고 싶으므로 다음과 같은 구문으로 시도했습니다.

public String controllerMethod(@RequestParam(value="myParam") List<String> myParams){
    ....
}

public String controllerMethod(@RequestParam(value="myParam") String[] myParams){
    ....
}

그러나 그들 중 어느 것도 myParams를 바인딩하지 않습니다. 맵에 값을 추가하더라도 매개 변수를 바인딩 할 수 없습니다.

public String controllerMethod(@RequestParam(value="myParam") Map<String, String> params){
    ....
}

목록 속성이있는 @ModelAttribute로 개체를 만들지 않고도 일부 매개 변수를 목록 또는 배열에 바인딩하는 구문이 있습니까?

감사


나는 이것이 가능하다고 생각하지 않습니다. 의 코드 HandlerMethodInvoker.resolveRequestParam는 첫 번째 값만 가져옵니다
skaffman 2011 년

6
( Spring Boot ) : method = RequestMethod.GET또는 method = RequestMethod.POST? 경우 .GET @RequestParam List<String> groupVal에서 성취 ?groupVal=kkk,ccc,mmm성공적으로 ( 봄 부팅 )
바질

답변:


77

의 배열 @RequestParam은 동일한 이름의 여러 매개 변수를 바인딩하는 데 사용됩니다.

myparam=myValue1&myparam=myValue2&myparam=myValue3

@ModelAttribute-스타일 인덱스 매개 변수 를 바인딩해야한다면 @ModelAttribute어쨌든 필요하다고 생각 합니다.


1
양식을 직렬화하고 ajax로 i를 전송하여 매개 변수를 전송하기 때문에 주문에 문제가있을 수 있습니다 (내 경우에는 유지하는 것이 매우 중요합니다). "전통적인"@ModelAttribute 방식을 사용하겠습니다.
Javi

UriTemplate 또는 다른 방법으로 이러한 정렬 매핑으로 URI를 구성하는 방법을 알고 계십니까? (이런 종류의 자원의 클라이언트).
Chomeh

내 자신의 질문에 대답하면 봄 UriTemplate이 RFC6570을 지원하지 않으며 damnhandy 구현을 사용합니다. stackoverflow.com/questions/14153036/…
Chomeh

110

또는 그렇게 할 수 있습니다.

public String controllerMethod(@RequestParam(value="myParam[]") String[] myParams){
    ....
}

예를 들어 다음과 같은 양식에서 작동합니다.

<input type="checkbox" name="myParam[]" value="myVal1" />
<input type="checkbox" name="myParam[]" value="myVal2" />

이것은 가장 간단한 해결책입니다. :)


4
그게 질서를 유지합니까?
앤드류 쿡 2012 년

7
따라서 Spring 3.0에서 [] 대신 이름 만 사용할 수있었습니다. @RequestParam (value = "myParam") String [] myParams
M Smith

3
그래도 @MSmith의 결과는 공유하지 않습니다.
droope

2
이것을 List<String>통해 얻을 수 있습니까? 또한 같은 자바 빈 얻을 수있다List<MyBean>
Juzer 알리

3
매개 변수 이름에서 대괄호를 제거 할 수 있다고 생각합니다.
theblang

19

Donal Fellows가 말한 것을 보완하기 위해 @RequestParam과 함께 List를 사용할 수 있습니다.

public String controllerMethod(@RequestParam(value="myParam") List<ObjectToParse> myParam){
....
}

도움이 되었기를 바랍니다.


12

method = RequestMethod.GET사용할 수 있다면 질문 자체에 대한 의견에서 basil이 말한 내용을 구독하십시오 @RequestParam List<String> groupVal.

그런 다음 매개 변수 목록으로 서비스를 호출하는 것은 다음과 같이 간단합니다.

API_URL?groupVal=kkk,ccc,mmm

10

이를 달성 할 수있는 한 가지 방법 (해킹 방식으로)은 List. 이렇게 :

class ListWrapper {
     List<String> myList; 
     // getters and setters
}

그러면 컨트롤러 메서드 서명은 다음과 같습니다.

public String controllerMethod(ListWrapper wrapper) {
    ....
}

요청에 전달하는 컬렉션 이름이 래퍼 클래스의 컬렉션 필드 이름과 일치하는 경우 @RequestParam또는 @ModelAttribute주석 을 사용할 필요가 없습니다 . 제 예에서 요청 매개 변수는 다음과 같아야합니다.

myList[0]     : 'myValue1'
myList[1]     : 'myValue2'
myList[2]     : 'myValue3'
otherParam    : 'otherValue'
anotherParam  : 'anotherValue'

글쎄, 이것은 @ModelAttribute를 사용하는 것과 거의 동일하지만 유일한 차이점은 매개 변수가 주석이 없다는 것입니다. 래퍼를 만들고 싶지 않았기 때문에 @ModelAttribute를 피하고 싶었습니다. @ModelAttribute 주석이없는 컨트롤러 메서드에 매개 변수를 추가하면 (그리고 HttpRequest, HttpResponse ...) 프레임 워크가이를 @ModelAttribute로 주석이 달린 경우. 그래서 그것이 사실이라면 이것은 정확히 @ModelAttribute를 갖는 것과 같습니다. 그러나 귀하의 답변에 감사드립니다.
Javi

4

Collection을 요청 매개 변수로 받아 들일 수는 있지만 소비자 측에서는 컬렉션 항목을 쉼표로 구분 된 값으로 전달해야 한다는 것이 분명하지 않았습니다 .

예를 들어 서버 측 API가 다음과 같은 경우 :

@PostMapping("/post-topics")
public void handleSubscriptions(@RequestParam("topics") Collection<String> topicStrings) {

    topicStrings.forEach(topic -> System.out.println(topic));
}

아래와 같이 RequestParam으로 RestTemplate에 컬렉션을 직접 전달 하면 데이터가 손상됩니다.

public void subscribeToTopics() {

    List<String> topics = Arrays.asList("first-topic", "second-topic", "third-topic");

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.postForEntity(
            "http://localhost:8088/post-topics?topics={topics}",
            null,
            ResponseEntity.class,
            topics);
}

대신 사용할 수 있습니다.

public void subscribeToTopics() {

    List<String> topicStrings = Arrays.asList("first-topic", "second-topic", "third-topic");
    String topics = String.join(",",topicStrings);

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.postForEntity(
            "http://localhost:8088/post-topics?topics={topics}",
            null,
            ResponseEntity.class,
            topics);
}

완전한 예는 여기 에서 찾을 수 있습니다. 누군가 두통을 덜어주기를 바랍니다. :)


-7

아래와 같이 확인란 토글로 숨겨진 필드 값을 변경하십시오.

HTML :

<input type='hidden' value='Unchecked' id="deleteAll" name='anyName'>
<input type="checkbox"  onclick="toggle(this)"/> Delete All

스크립트:

function toggle(obj) {`var $input = $(obj);
    if ($input.prop('checked')) {

    $('#deleteAll').attr( 'value','Checked');

    } else {

    $('#deleteAll').attr( 'value','Unchecked');

    }

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.