这是我的代码。
唯一的控制器具有一个方法,该方法的参数用@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时,它就会决定参数是否匹配。这就是为什么。
我试图提高自定义解析器的优先级,但是我不知道该怎么做。
有什么解决方法的主意吗?非常感谢。