Angular 8 Spring Boot: требуемый строковый параметр отсутствует

#angular #spring-boot #rest #endpoint

#angular #spring-boot #остальное #конечная точка

Вопрос:

Я получаю, что требуемый строковый параметр отсутствует, когда я хочу вызвать свою конечную точку GET, и я не знаю, что не так с моим кодом:

Angular:

   getFrameworkPolls(year: string, companyId: string) {
    const params = new HttpParams();
    params.append('year', year);
    params.append('companyId', companyId);
    return this.http.get<IFrameworkPoll[]>(`${this.url}/poll`, {params});
  }
  

Весна:

 @GetMapping("document/frameworks/poll")
public ResponseEntity<List<FrameworkPoll>> findFrameworksWithPolls(@RequestParam String year, @RequestParam String companyId) {
    return pollFacade.findFrameworksWithPolls(year, companyId);
}
  

ОШИБКА:

 29 Oct 2020;09:40:17.072 [http-nio-8081-exec-7] ERROR  [c.i.e.e.e.GlobalExceptionHandler:78] In global Exception handler
org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'year' is not present
    at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:202)
    at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:113)
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:126)
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:166)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  

Ответ №1:

HttpParams должен быть неизменяемым. Метод добавления не изменяет существующий экземпляр. Вместо этого они возвращают новые экземпляры с примененными изменениями, поэтому вам необходимо назначить, как показано ниже:

 getFrameworkPolls(year: string, companyId: string) {
    const params = new HttpParams();
    params = params.append('year', year);
    params = params.append('companyId', companyId);
    return this.http.get<IFrameworkPoll[]>(`${this.url}/poll`, {params});
  }