본문 바로가기
Spring/TroubleShooting

java.lang.IllegalArgumentException: Cannot generate variable name for non-typed Collection parameter type

by Mecodata 2024. 4. 11.

현상

1. RestTemplate.postForEntity()를 통해 특정 URL(/receive)에 Client로부터 전송받은 값에 따라 DTO의 종류를 다르게 하여 List<Dto> 객체를 전송하도록 로직을 구성  

List<CarDto> carDtos = carRepo.findAll();
restTemplate.postForObject(".../api/car/receive", carDtos, Void.class);

2. 컨트롤러에 해당 요청 수령 시(/receive) 데이터를 처리하는 로직을 작성하였는데 이때, 하나의 API에서 DTO의 종류에 따라 처리 방식을 다르게 하기 위하여 @RequestBody의 데이터 타입을 List<?>으로 설정하였더니 해당 에러가 발생

 

원인

- 해당 에러는 Spring에서 컬렉션의 제네릭 타입을 지정하지 않았을 때 주로 발생

 

해결 방법

- 요청 수령 시 데이터를 처리하는 API를 하나로 개발하지 않고 DTO 종류별 API로 나눠 개발하여 각 API에서 @RequestBody의 데이터 타입을 List<CarDto>처럼 ?를 사용하지 않고 명확히 정의하여 해결

@RequestMapping("/api/car")
public class CarController {

    // Before
    @PostMapping("/receive")
    public void synchronizeDBReceiveInfoNtApi(@RequestBody List<?> data) throws Exception {
        ...
    }

    // After
    @PostMapping("/receive/car")
    public void synchronizeDBReceiveInfoNtApi(@RequestBody List<CarDto> data) throws Exception {
        ...
    }
    
    @PostMapping("/receive/bus")
    public void synchronizeDBReceiveInfoNtApi(@RequestBody List<BusDto> data) throws Exception {
        ...
    }
}

댓글