参数为Map时,自定义控制器方法参数解析器不匹配

时间:2019-03-07 15:41:29

标签: spring-mvc

这是我的代码。

唯一的控制器具有一个方法,该方法的参数用@UpperCase注释,并键入为StringWrapper

// MainController.java

@RestController
@ResponseBody
public class MainController {
    @RequestMapping("/")
    public String get(@UpperCase("lowercase") StringWrapper upperCase){
        return upperCase.toString();
    }
}

自定义类型StringWrapper只是将字符串扭曲到HashMap中。

// StringWrapper.java

public class StringWrapper extends HashMap<String,String>  {
    public StringWrapper(String str) {
        this.put("data",str);
    }

    @Override
    public String toString() {
        return this.get("data");
    }
}

注释和解析器的定义。

// UpperCase.java

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface UpperCase {
    String value();
}


// UpperCaseResolver.java

public class UpperCaseResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(UpperCase.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        return new StringWrapper(parameter.getParameterAnnotation(UpperCase.class).value().toUpperCase());
    }
}


// UpperCaseResolverConfig.java

 @Configuration
public class UpperCaseResolverConfig implements WebMvcConfigurer {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new UpperCaseResolver());
    }
}

错误消息:

ERROR 7388 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: argument type mismatch
Controller [com.example.custom_parameter_resolver_demo.controller.MainController]
Method [public java.lang.String com.example.custom_parameter_resolver_demo.controller.MainController.get(com.example.common.annotation.pojo.StringWrapper)] with argument values:
 [0] [type=org.springframework.validation.support.BindingAwareModelMap] [value={}] ] with root cause

java.lang.IllegalArgumentException: argument type mismatch
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_191]
    at 

我使用的Spring Boot的版本为2.1.3.RELEASE

Spring MVC似乎将参数匹配到名为MapMethodProcessor的内部解析器,而不是我的自定义解析器。

package org.springframework.web.method.annotation;

public class MapMethodProcessor implements HandlerMethodArgumentResolver, HandlerMethodReturnValueHandler {

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

每当参数是Map时,它就会决定参数是否匹配。这就是为什么。

我试图提高自定义解析器的优先级,但是我不知道该怎么做。

有什么解决方法的主意吗?非常感谢。

0 个答案:

没有答案