Affects: 5.3.27


I have a MVC controller with matrix parameters:

    @RequestMapping(
            method = POST,
            produces = APPLICATION_JSON_VALUE,
            path = "/{mbeanName}/{method}"
    )
    public Mono<MBeanSessionResultListDto.ApiReply> runMethod(

            @PathVariable(name = "mbeanName")
            String mbeanName,
            @MatrixVariable(pathVar = "mbeanName")
            MultiValueMap<String, String> nodeSelectorQuery,

            @PathVariable(name = "method")
            String method,
            @MatrixVariable(pathVar = "method", required = false)
            MultiValueMap<String, String> methodArgs
    )

As long as I use matrix variables, this declaration works perfectly. For example:

POST {{jasmine-http}}/mbean/amsl.common:service=UtilConfig;nodeId=w1a/listCacheSummary;arg1=x,arg2=y

If I omit the second set of matrix variables (arg1=x,arg2=y), even though I have it marked as not required, I get an IlegalStateException:

10:15:05.163 ERROR c.b.r.s.BidsRestServerAutoConfigure$3 handleAll: 
java.lang.IllegalStateException: argument type mismatch
Controller [com.bids.jasmine.rest.TypelessMBeanController]
Method [public reactor.core.publisher.Mono<com.bids.jasmine.MBeanSessionResultListDto$ApiReply> com.bids.jasmine.rest.TypelessMBeanController.runMethod(java.lang.String,org.springframework.util.MultiValueMap<java.lang.String, java.lang.String>,java.lang.String,org.springframework.util.MultiValueMap<java.lang.String, java.lang.String>)] with argument values:
 [0] [type=java.lang.String] [value=amsl.common:service=UtilConfig],
[1] [type=org.springframework.util.LinkedMultiValueMap] [value={nodeId=[w1a]}],
[2] [type=java.lang.String] [value=listCacheSummary],
[3] [type=java.util.Collections$EmptyMap] [value={}] 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:210)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
    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:808)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:555)
<< stack trace pruned >>
    at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.IllegalArgumentException: argument type mismatch
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)

If I change the type of method args from

MultiValueMap<String, String> methodArgs

to

Object methodArgs

It works, but now I have to check the type and cast it to use it.

Comment From: rstoyanchev

Looks like this was resolved by #31483 in 6.0.14.