Не удается передать статус HttpParameter в приложение Spring Boot MVC

Я запускаю приложение Spring boot MVC, когда я передаю «status» в качестве одного из параметров http (http://localhost:8080/greeting?status=Soemthing), он просто не работает со следующей ошибкой.

Ошибка поля в объекте 'modelAndView' в поле 'status': отклоненное значение [Soemthing]; коды [typeMismatch.modelAndView.status, typeMismatch.status, typeMismatch.org.springframework.http.HttpStatus, typeMismatch]; аргументы [org.springframework.context.support.DefaultMessageSourceResolvable: коды [modelAndView.status, status]; аргументы []; сообщение по умолчанию [статус]]; сообщение по умолчанию [Не удалось преобразовать значение свойства типа [java.lang.String] в требуемый тип [org.springframework.http.HttpStatus] для свойства 'status'; вложенное исключение - org.springframework.core.convert.ConversionFailedException: не удалось преобразовать из типа [java.lang.String] в тип [org.springframework.http.HttpStatus] для значения 'Soemthing'; вложенное исключение - java.lang.IllegalArgumentException: нет константы перечисления org.springframework.http.HttpStatus.Soemthing]

Как его воспроизвести Загрузите официальный демонстрационный проект mvc Spring отсюда https://github.com/spring-guides/gs-serving-web-content

Измените контроллер Greetign следующим образом

@RequestMapping("/greeting")
public ModelAndView greeting(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model, ModelAndView mv) {
    model.addAttribute("name", name);
    mv.setViewName("greeting");
    return mv;
}

Я только что добавил новый параметр ModelAndView, а также изменил тип возвращаемого значения на ModelAndview вместо String.

Запустите проект и нажмите URL-адрес http://localhost:8080/greeting?status=Soemthing, это не работает.

Потратили много времени на его отладку, ничего не могу найти.

Полная трассировка стека здесь

Не передавайте «статус» в качестве параметра. Поскольку "status" является ключевым словом по умолчанию для org.springframework.http.HttpStatus. Измените его имя на «status_value» или другое имя. Это будет работать


person Ravi    schedule 03.04.2017    source источник
comment
например, он называется именем. Почему вы используете как «статус»?   -  person Luke Bajada    schedule 03.04.2017
comment
name http param уже существует в этом примере, я попытался внести минимальные изменения в официальный пример кода загрузки Spring. Параметр name определен, но его не нужно передавать, так как он имеет собственное значение по умолчанию. Главный вопрос заключается в том, когда я передаю статус paramater, почему он пытается преобразовать его как перечисление HttpStatus, а не сохранять его обычным String.   -  person utkusonmez    schedule 03.04.2017
comment
Вы также можете использовать этот URL-адрес localhost: 8080 / welcome? Status = Soemthing & name = DoesntMatter   -  person Ravi    schedule 04.04.2017
comment
org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 ошибка Ошибка поля в объекте 'modelAndView' в поле 'status': отклоненное значение [Something]; коды [typeMismatch.modelAndView.status, typeMismatch.status, typeMismatch.org.springframework.http.HttpStatus, typeMismatch]; аргументы [org.springframework.context.support.DefaultMessageSourceResolvable: коды [modelAndView.status, status]; аргументы []; сообщение по умолчанию [статус]]; сообщение по умолчанию [Не удалось преобразовать значение свойства типа 'java.lang.String' в требуемый тип 'org.springframework.http.HttpStatus' для свойства 'status'; вложенное исключение - org.springframework.core.convert.ConversionFailedException: не удалось преобразовать тип [java.lang.String] в тип [org.springframework.http.HttpStatus] для значения 'Something'; вложенное исключение - это java.lang.IllegalArgumentException: нет константы перечисления org.springframework.http.HttpStatus.Something] в org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument.frameAttributeMethodProcessor.resolveArgument. method.support.HandlerMethodArgumentResolverComposite.resolveArgument (HandlerMethodArgumentResolverComposite.java:121) при org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues ​​(InvocableHandlerMethod.java:158) при org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest ( InvocableHandlerMethod.java:128) по адресу org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle (ServletInvocableHandlerMethod.java:116c.framework.AdvancedMethod.java: RequestMappingHandlerAdapter.java:827) на org.springframework.web.servlet.m vc.method.annotation.RequestMappingHandlerAdapter.handleInternal (RequestMappingHandlerAdapter.java:738) в org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle (AbstractHandlerSethodwork.ispatcher. doDispatch (DispatcherServlet.java:963) в org.springframework.web.servlet.DispatcherServlet.doService (DispatcherServlet.java:897) в org.springframework.web.servlet.FrameworkServlet.processgrequest. .web.servlet.FrameworkServlet.doGet (FrameworkServlet.java:861) на javax.servlet.http. HttpServlet.service (HttpServlet.java:622) по адресу org.springframework.web.servlet.FrameworkServlet.service (FrameworkServlet.java:846) по адресу javax.servlet.http.HttpServlet.service (HttpServlet.or: .catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:230) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:165) в org.apache.tomserver.websoter. .java: 52) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:192) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:165) в orgrame.work. filter.RequestContextFilter.doFilterInternal (RequestContextFilter.java:99) на org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) на org.apache.catalina.core.Application (Application). in.java:192) на org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:165) на org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal (или HttpPutFormContentFilter.doFilterInternal (или HttworkFilter.java.js) .filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:192) в org.apache.catalina.java:192) в org.apache.catalina.doFilterChain: Application (Application). ) в org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal (HiddenHttpMethodFilter.java:81) в org.springframework.web.filter.OncePerRequestFilter.doFilter (. internalDoFilter (ApplicationFilterChain.java:192) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:165) в org.springframework.web.filter.Chara cterEncodingFilter.doFilterInternal (CharacterEncodingFilter.java:197) в org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) в org.apache.catalation.infilter.java:107) в org.apache.catalina.infilter.Application (приложение). .apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:165) в org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:198) в org.apache.catalina.core. StandardContextValve.invoke (StandardContextValve.java:96) на org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:474) на org.apache.catalina.core.StandardHostValve.invoke (atjava:140) .apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:79) в org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:87) в org.apache.catalina.valves.AbstractAccessLValve .java: 624) в org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:349) в org.apache.coyote.http11.Http11Processor.service (Http11Processor.java:783) в org.apache.coyote. AbstractProcessorLight.process (AbstractProcessorLight.java:66) в org.apache.coyote.AbstractProtocol $ ConnectionHandler.process (AbstractProtocol.java:798) в org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.java: 1434) на org.apache.tomcat.util.net .SocketProcessorBase.run (SocketProcessorBase.java:49) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) в java.util.concurrent.ThreadPoolExecutor ($ WorkorPool. apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) в java.lang.Thread.run (Thread.java:745)   -  person Ravi    schedule 04.04.2017


Ответы (3)


Несмотря на то, что это старый пост, я хотел поделиться своим решением.

person vignesh emphatic    schedule 18.06.2018

Фактически вам не нужен параметр ModelAndView mv метода. Просто удали его.

Вернуть имя представления в виде строки:

Возможно, сейчас уже слишком поздно, но я думаю, что это поможет.

@RequestMapping("/greeting")
public String greeting(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) {
    model.addAttribute("name", name);

    return "greeting";
}
person Halil    schedule 08.09.2018

Почему вы передаете «статус», если параметром должно быть «имя»? Кроме того, судя по ошибке, «Soemthing» не является допустимым значением для HttpStatus - вам следует попробовать то, что находится здесь: docs.spring.io/spring/docs/current/javadoc-api/org/

public class MyHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter( MethodParameter parameter ) {
        return ModelAndView.class.equals( parameter.getParameterType() );
    }

    @Override
    public Object resolveArgument( MethodParameter parameter, ModelAndViewContainer mavContainer, 
        NativeWebRequest webRequest, WebDataBinderFactory binderFactory ) throws Exception {
        return new ModelAndView();
    }
    
}
person meta v    schedule 22.04.2021