实现 HandlerMethodArgumentResolver 接口
自定义解析器需要实现 HandlerMethodArgumentResolver
接口,此接口包含两个函数:
public interface HandlerMethodArgumentResolver {
/**
* 入参筛选
*
* @param methodParameter 参数集合
* @return 格式化后的参数
*/
boolean supportsParameter(MethodParameter var1);
/**
* 出参设置
*
* @param methodParameter 入参集合
* @param modelAndViewContainer model 和 view
* @param nativeWebRequest web相关
* @param webDataBinderFactory 入参解析
* @return 包装对象
*/
@Nullable
Object resolveArgument(MethodParameter var1, @Nullable ModelAndViewContainer var2, NativeWebRequest var3, @Nullable WebDataBinderFactory var4) throws Exception;
}
实现接口的类
public class MenuHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.getParameterType().equals(Person.class);
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
//为了测试先写固定用户名,实际取真实用户
return new Person("娃哈哈", 10, "长安街");
}
}
Person
类
public class Person {
private String name;
private Integer age;
private String address;
public Person() {
}
public Person(String name, Integer age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
在 Web 配置类中创建实例
注意这个方法 addArgumentResolvers
中的这段代码 argumentResolvers.add(new MenuHandlerMethodArgumentResolver());
这段代码的意思就把上一步创建的 MenuHandlerMethodArgumentResolver.java
类交给 Spring
@Slf4j
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
@AllArgsConstructor
@EnableConfigurationProperties({
ZycUploadProperties.class, ZycFileProperties.class
})
public class ZycWebMvcConfiguration implements WebMvcConfigurer {
private final ZycUploadProperties zycUploadProperties;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
String path = zycUploadProperties.getSavePath();
registry.addResourceHandler("/upload/**")
.addResourceLocations("file:" + path + "/upload/");
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new TokenArgumentResolver());
argumentResolvers.add(new MenuHandlerMethodArgumentResolver());
}
}
在 Controller 中创建请求的方法
@RequestMapping(value = {"/test"}, method = RequestMethod.GET)
@ResponseBody
public Person test(Person person) {
System.out.println(person);
return person;
}
测试
在浏览器请求上一步创建的接口 http://127.0.0.1:8080/person/test
get请求,并且不需要传任何参数
浏览器结果 {"name":"娃哈哈","age":10,"address":"长安街"}
控制台结果 Person{name='娃哈哈', age=10, address='长安街'}
可以通过实现 HandlerMethodArgumentResolver
接口来实现对自定义的参数进行解析。
比如可以解析自定义的时间格式、自定义解析Map对象等这些spring原本不支持的对象格式。