Почему Spring MVC не выдает ошибку, когда вы POST выполняете действие контроллера, которое принимает HTTP GET? - PullRequest
1 голос
/ 18 ноября 2011

Я только что заметил странную проблему, когда я тестировал свое приложение.Я случайно отправил сообщение в метод, который принимает 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);
    }
}

Я нашел этот код для другого ответа на вопрос на этом сайте.

Ответы [ 2 ]

2 голосов
/ 18 ноября 2011

Я полагаю, что ваш тестовый код имитирует шаг отправки, который пытается найти соответствующую Controller сигнатуру метода после разрешения URL и HTTP-метода.Другими словами, вы не тестируете свой контроллер на нужном уровне, если хотите проверить привязки HTTP-сообщений.Для такого рода тестирования вы, вероятно, захотите развернуть его на сервере (возможно, встроенном в ваш тест Jetty) и использовать для вызова RestTemplate.Это то, что я делаю в любом случае.

0 голосов
/ 18 ноября 2011

Если вы аннотируете аннотации Spring MVC, как показано ниже @RequestMapping(method = RequestMethod.GET это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...