У меня в Spring (2.0.5) есть следующий контроллер
@RestController
public class FaqController {
@GetMapping("/faqs")
public void get(@RequestParam("language") final Locale locale) {
System.out.println(locale);
}
}
Когда я выполняю запрос GET через Postman / cURL, используя url: http://localhost:8080/faqs?language, вызывается метод контроллера, а locale - это null.
Когда я выполняю тот же URL-адрес с аннотированным тестом JUnit @MvcTest, который выглядит так:
@RunWith(SpringRunner.class)
@WebMvcTest
public class FaqControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void test() throws Exception {
this.mockMvc.perform(get("/faqs?language"));
}
}
тогда вызывается метод нет, вместо этого вызывается org.springframework.web.bind.MissingServletRequestParameterException с сообщением: Отсутствует обязательный параметр языкового стандарта 'language'.
Почему такая разница? Я что-то упускаю?




Вы хотите, чтобы он был нулевым? Если он не нужен, либо удалите его, либо установите значение «Не требуется».
@RestController
public class FaqController {
@GetMapping("/faqs")
public void get(@RequestParam( value = "language", required = false ) final Locale locale) {
System.out.println(locale);
}
}
Да, довольно странно, я удивлен, что вы не получаете исключения, когда попадаете в конечную точку с нулевым значением Local. По умолчанию должно быть required = true.
Я получаю исключение, но только когда тестовый пример попадает в конечную точку. При ударе Postman / cURL я получаю нуль.
Да, вы также должны получать исключение, когда нажимаете его с помощью Postman, потому что по умолчанию требуется requestParam, если он явно не установлен required = false.
Я предпочитаю исключение нулю. Но в любом случае мне больше интересно узнать, почему такая несогласованность в обработке параметров запроса такого типа.