Matelutex
Matelutex

Reputation: 2220

Angular 8 + Spring Boot: required String parameter is not present

I get required String parameter is not present when I want to invoke my GET endpoint and I don't know what's wrong with my code:

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});
  }

Spring:

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

ERROR:

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)

Upvotes: 1

Views: 1396

Answers (1)

Umesh Sanwal
Umesh Sanwal

Reputation: 777

HttpParams is intended to be immutable. The append method don't modify the existing instance. Instead they return new instances, with the changes applied, hence you need to assign as below:

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});
  }

Upvotes: 2

Related Questions