Сбой ссылок HATEOAS на Spring Framework @аргумент переменной карты пути

#java #rest #spring-mvc #spring-hateoas

#java #остальное #spring-mvc #spring-hateoas

Вопрос:

Я пишу ReST API с использованием Spring-mvc и Spring hateoas framework. Я пытаюсь создать ссылку ‘self’ на метод, который имеет @pathvariable Map в качестве параметра. Я пытаюсь разрешить несколько переменных пути (и это может увеличиться в будущем) для метода, и в рамках метода я пытаюсь разрешить отдельный путь на основе наличия или отсутствия переменной.Все работает нормально, пока я не попытаюсь создать самоссылку.

Я получаю исключение

Произошла неожиданная ошибка

тип = Внутренняя ошибка сервера, статус = 500). Не найдено конвертера, способного конвертировать из типа [@org.springframework.web.bind.annotation.Переменный путь java.util.Map] для ввода [java.lang.Строка]

Вот мой Метод

 @RequestMapping(value={"/subs","/masterclient/{masterclient}/subs"}, 
    method = RequestMethod.GET)

   public List<Jobs>  getJobList(
         @PathVariable  Map<String, String> pathVariables,
         @RequestParam(value="count", required = false) int count) 
   {

      if (pathVariables.containsKey("masterclient")) 
      {
         System.out.println("Master Client = "  
                         pathVariables.get("masterclient"));
      } 
      else 
      {
         System.out.println("No Master Client");
      }



      //Add a Link to the self here.
      List list = new ArrayList<Jobs>();
           list.add(linkTo(methodOn(ControllerJobs.class).getJobList(pathVariables, count)).withSelfRel());

      return list;
   }
  

Трассировка стека исключений приведена ниже

2016-10-24 15:39:48.821 ОШИБКА 12068 — [nio-8080-exec-1] .a.c.c.c.[.[.[.c.v.a.[DispatcherServlet] : Servlet.service() для сервлета [DispatcherServlet] в контексте с path [/com.causeway.vixen.api] вызвал исключение [Ошибка обработки запроса; вложенное исключение — org. springframework.core.преобразовать.Исключение ConverterNotFoundException: не найдено конвертера, способного конвертировать из типа [@org.springframework.web.bind.annotation.Переменный путь java.util.Карта], чтобы ввести [java.lang.Строка]] с первопричиной

org.springframework.core.convert.Исключение ConverterNotFoundException: не найдено конвертера, способного конвертировать из типа [@org.springframework.web.bind.annotation.Переменный путь java.util.Map] для ввода [java.lang.Строка] в org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:313) ~[spring-core-4.3.2.RELEASE.jar:4.3.2.RELEASE] в org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:195) ~ [spring-core-4.3.2.RELEASE.jar:4.3.2.RELEASE] в org.springframework.hateoas.mvc.AnnotatedParametersParameterAccessor$BoundMethodParameter.asString(AnnotatedParametersParameterAccessor.java:172 ) ~[spring-hateoas-0.20.0.RELEASE.jar:na] в org.springframework.hateoas.mvc.ControllerLinkBuilderFactory.linkTo(ControllerLinkBuilderFactory.java:143 ) ~[spring-hateoas-0.20.0.RELEASE.jar: na] в org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo(ControllerLinkBuilder.java:172) ~[spring-hateoas-0.20.0.RELEASE.jar:na] в com.causeway.vixen.api.application.ControllerJobs.getJobList(ControllerJobs.java:153) ~[classes/:na] в sun.reflect.NativeMethodAccessorImpl.invoke0(собственный метод) ~[na:1.8.0_102] в sun.reflect.NativeMethodAccessorImpl.invoke(неизвестный источник) ~[na:1.8.0_102] в sun.reflect.Делегирование methodaccessorimpl.invoke (неизвестный источник) ~[na:1.8.0_102] в java.lang.reflect.Метод.invoke (неизвестный источник) ~[na:1.8.0_102] в org.springframework.web.method.support.Метод InvocableHandlerMethod.Выполните вызов (InvocableHandlerMethod.java:221) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] в org.springframework.web.method.support.Вызываемый метод обработки данных.invokeForRequest(InvocableHandlerMethod.java:136) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] в org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114) ~[spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE] в org.springframework.web.servlet.mvc.method.annotation.Метод RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~ [spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE] в организации.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE] в org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE] в org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE] в org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) ~[spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE] в org.springframework.web.servlet.FrameworkServlet.ProcessRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE] в org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) ~[spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE] в javax.servlet.http.HttpServlet.service(HttpServlet.java:622) ~[tomcat-embed-core-8.5.4.jar:8.5.4] в org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~ [spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE] в javax.servlet.http.HttpServlet.service(HttpServlet.java:729) ~[tomcat-embed-core-8.5.4.jar:8.5.4] в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) ~[tomcat-embed-core-8.5.4.jar:8.5.4] в org.apache.catalina.core.Цепочка ApplicationFilterChain.доФильтр (ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.4.jar:8.5.4] в org.apache.tomcat.websocket.сервер.WsFilter.doFilter(WsFilter.java:52) ~[tomcat-embed-websocket-8.5.4.jar:8.5.4] в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.4.jar:8.5.4] в org.apache.catalina.core.Цепочка ApplicationFilterChain.доФильтр (ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.4.jar:8.5.4] в org.springframework.web.filter.RequestContextFilter.Внутренний фильтр (RequestContextFilter.java:99) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] в org.springframework.web.filter.OncePerRequestFilter.доФильтр (OncePerRequestFilter.java:107) ~ [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(цепочка ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.4.jar:8.5.4] в org.apache.catalina.core.Цепочка ApplicationFilterChain.доФильтр (ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.4.jar:8.5.4] в org.springframework.web.filter.HttpPutFormContentFilter.Внутренний фильтр (HttpPutFormContentFilter.java:87) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] в org.springframework.web.filter.OncePerRequestFilter.доФильтр (OncePerRequestFilter.java:107) ~ [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.4.jar:8.5.4] в org.apache.catalina.core.Цепочка ApplicationFilterChain.доФильтр (ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.4.jar:8.5.4] в org.springframework.web.filter.Скрытый HttpMethod-фильтр.Внутренний фильтр (скрытый HttpMethod filter.java:77) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] в org.springframework.web.filter.OncePerRequestFilter.доФильтр (OncePerRequestFilter.java:107) ~ [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(цепочка ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.4.jar:8.5.4] в org.apache.catalina.core.Цепочка ApplicationFilterChain.доФильтр (ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.4.jar:8.5.4] в org.springframework.web.filter.CharacterEncodingFilter.Внутренний фильтр (CharacterEncodingFilter.java:197) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] в org.springframework.web.filter.OncePerRequestFilter.доФильтр (OncePerRequestFilter.java:107) ~ [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.4.jar:8.5.4] в org.apache.catalina.core.Цепочка ApplicationFilterChain.доФильтр (ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.4.jar:8.5.4] в org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) ~[tomcat-embed-core-8.5.4.jar:8.5.4] в org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) [tomcat-embed-core-8.5.4.jar:8.5.4] в org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:522) [tomcat-embed-core-8.5.4.jar:8.5.4] в организации.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.4.jar:8.5.4] в org.apache.catalina.valves.Ошибка reportvalve.invoke(ошибка reportvalve.java:79) [tomcat-embed-core-8.5.4.jar:8.5.4] в org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.4.jar:8.5.4] в org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) [tomcat-embed-core-8.5.4.jar:8.5.4] в org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java: 349) [tomcat-embed-core-8.5.4.jar:8.5.4] в org.apache.coyote.http11.Http11Processor.service(Http11Processor.java: 1110) [tomcat-embed-core-8.5.4.jar:8.5.4] в org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.4.jar:8.5.4] в org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:785) [tomcat-embed-core-8.5.4.jar:8.5.4] в org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1425) [tomcat-embed-core-8.5.4.jar:8.5.4] в организации.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.4.jar:8.5.4] на java.util.concurrent.ThreadPoolExecutor.runWorker (неизвестный источник) [na:1.8.0_102] в java.util.concurrent.ThreadPoolExecutor$Worker.run (неизвестный источник) [na:1.8.0_102] в org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.4.jar:8.5.4] на java.lang.Thread.run (неизвестный источник) [na: 1.8.0_102]

Комментарии:

1. Пожалуйста, отформатируйте ваше исключение в виде кода (значок фигурных скобок в редакторе).

2. Я только что увидел интересную ссылку, которая подтверждает, что java.utils. Необязательный параметр из java8 еще не реализован . Вот ссылка github.com/spring-projects/spring-hateoas/issues/373