Я только что заметил странную проблему, когда я тестировал свое приложение.Я случайно отправил сообщение в метод, который принимает HTTP GET (это была опечатка - я немного устал), но странно то, что Spring все равно выполнял действие GET - он не выдавал ошибку.
Вот сопоставление для моего действия GET, к которому я вместо этого отправлял сообщение:
@RequestMapping(value = "/partialMapping/{partialMappingId}/edit", method = RequestMethod.GET)
public ModelAndView edit(@PathVariable long partialMappingId) {
return new ModelAndView(view("edit"), "partialMapping",
partialMappingService.findPartialMapping(partialMappingId));
}
То, что я ожидал, было для Spring, чтобы сказать: «Нет действия под названием /partalMapping /{partMappingId} / edit для HTTP POST ".
Вместо ... если вы используете HandlerAdapter
и передаете ему" POST "и" /partalMapping / 1 / edit ", он запускает мое действие index
вместо этого ("/partalMapping").Это не выдает ошибку.Почему?
Это ошибка весной или это желаемое поведение?Это не имеет большого значения, когда дело доходит до производственного кода, но это, безусловно, усложняет отладку.
Вот код, который я использую для выполнения действия контроллера в моих тестах:
protected ModelAndView handle(HttpServletRequest request, HttpServletResponse response) {
try {
final HandlerMapping handlerMapping = applicationContext.getBean(HandlerMapping.class);
final HandlerExecutionChain handler = handlerMapping.getHandler(request);
assertNotNull("No handler found for request, check you request mapping", handler);
final Object controller = handler.getHandler();
// if you want to override any injected attributes do it here
final HandlerInterceptor[] interceptors =
handlerMapping.getHandler(request).getInterceptors();
for (HandlerInterceptor interceptor : interceptors) {
final boolean carryOn = interceptor.preHandle(request, response, controller);
if (!carryOn) {
return null;
}
}
return handlerAdapter.handle(request, response, controller);
} catch(Exception e) {
throw new RuntimeException(e);
}
}
Я нашел этот код для другого ответа на вопрос на этом сайте.