names
간단한 웹 양식에서 보내는 중 입니다.
<form action="test" method="GET">
<select name="names" multiple="true">
<option>Doe, Jane</option>
<option>Doe, John</option>
</select>
<input type="submit"/>
</form>
는 names
A와 바인딩 된 List
컨트롤러에서 :
@GetMapping("/test")
public String test(@RequestParam List<String> names, Model m) {
System.out.println(names.size());
System.out.println(names);
return "test";
}
하지만 내 이름 값에 쉼표 ( ,
)가 포함되어 있기 때문에 Spring은 단일 이름 값이어야하는 것을 두 개의 문자열로 구문 분석합니다.
GET
요청 /test?names=Doe, John
(쉼표에서 URL 인코딩을 제거 ,
하는 %2C
두 개의 문자열 값을 포함하는 결과리스트에 가독성) Doe
과 John
오히려 단일 값보다 Doe, John
I 원하는대로.
그러나 다음과 같은 여러 값을 보낼 때 예상대로 작동 /test?names=Doe, Jane&names=Doe, John
합니다. 이 경우 두 개의 항목이있는 목록이 있습니다. Doe, Jane
및 Doe, John
.
한 가지 해결 방법은 다음을 포함하여 항상 names
양식에 빈 값을 보내는 것입니다 .
<input type="hidden" name="names"/>
그런 다음 목록에서 빈 값을 제거합니다. 그러나 나는 이것을 할 필요가 없습니다.
쉼표를 사용하여 문자열 값을 구문 분석하지 않고 대신 목록 속성 값이 단순히 반복 될 것으로 기대하도록 Spring MVC를 구성하는 방법은 ?name=Jon&name=Sue&name=Bob
무엇입니까?
Spring Boot 2.3.2를 사용하고 있습니다. 감사!
변환은 다음에서 발생하는 것으로 보입니다.
org.springframework.core.convert.support.StringToCollectionConverter
프레임 워크에 의해 등록 된 defult 변환기 여야합니다.
@InitBinder
컨트롤러 의 메서드 또는 컨트롤러 조언을 사용하여 변환기를 등록 할 수 있지만이 기본 변환기를 재정의하거나 비활성화하는 방법을 잘 모르겠습니다.
가장 간단한 방법은 HttpServletRequest에서 직접 매개 변수에 액세스하는 것으로 돌아가는 것입니다.
@Controller
public class TestController {
@RequestMapping("/test")
public String test(@RequestParam("names") List<String> names, HttpServletRequest request) {
//1
System.out.println(request.getParameterValues("names").length);
System.out.println(Arrays.toString(request.getParameterValues("names")));
//2
System.out.println(names.size());
System.out.println(names);
return null;
}
}
추가 실험 후에는 프레임 워크의의 호출을 비활성화 할 수 있습니다 StringToCollectionConverter
명시 적에서 변환을 제거하여 봄 부팅에서을 String.class
로 Collection.class
로부터 GenericConversionService
:
@Autowired
void conversionService(GenericConversionService genericConversionService) {
List<String> names = genericConversionService.convert("Ed, Al", List.class);
System.out.println(names.size()); // 2
genericConversionService.removeConvertible(String.class, Collection.class);
names = genericConversionService.convert("Ed, Al", List.class);
System.out.println(names.size()); // 1
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다