[java] @RequestParam에서 목록 바인딩

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

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로 개체를 만들지 않고도 일부 매개 변수를 목록 또는 배열에 바인딩하는 구문이 있습니까?

감사



답변

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

myparam=myValue1&myparam=myValue2&myparam=myValue3

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


답변

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

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

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

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

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


답변

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

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

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


답변

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

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

API_URL?groupVal=kkk,ccc,mmm


답변

이를 달성 할 수있는 한 가지 방법 (해킹 방식으로)은 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'


답변

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);
}

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


답변

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

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');

    }

}