HandlerMethodArgumentResolver 实现 Springboot 自定义参数解析

实现 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原本不支持的对象格式。

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值