如下:開發過程中,你可能會使用RequestParam注解,設置required = true,告訴前端這個參數是必傳的,
但是用過的基本了解,通常會因為前端傳了空字符串,導致校驗通過,實用性不佳,
原生的注解基本不能滿足實際開發需求,所以你需要自己寫一個。
@ResponseBody @RequestMapping("/data") public Map<String, Object> data( @RequestParam(required = true) String b) { return new HashMap<>(); }
HandlerMethodArgumentResolver
此時你需要寫一個切面,HandlerMethodArgumentResolver,直譯是,處理函數參數的分解器,實現這個接口也很簡單,
supportsParameter(支持參數):可以設置一些標志,表示你這個分解器可以處理這些參數,返回ture才執行resolveArgument()函數
resolveArgument(分解實參):處理實參的具體方法
import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; /** * Created by 12614 on 2018/5/11. */ public class TestArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter methodParameter) { return true; } @Override public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { System.out.println("TestArgumentResolver:resolveArgument"); return null; } }
Spring配置
<mvc:annotation-driven> <mvc:argument-resolvers> <bean class="xxxxx全類名"/> </mvc:argument-resolvers> </mvc:annotation-driven>
SpringBoot配置
既然要零配置,就不要違背設計初衷刻意去啟用Xml配置,在WebMvcConfigurerAdapter添加HandlerMethodArgumentResolver就好了 ,
import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import java.util.List; /** * Created by 12614 on 2018/5/11. */ @Configuration public class ApplicationConfigurer extends WebMvcConfigurerAdapter { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { super.addArgumentResolvers(argumentResolvers); argumentResolvers.add(new TestArgumentResolver()); } }
簡單的案例
自定義注解
import java.lang.annotation.*; /** * Created by 12614 on 2018/5/11. */ @Documented @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface Params { @AliasFor("name") String value() default ""; @AliasFor("value") String name() default ""; boolean required() default true; boolean notEmpty() default true; int maxLength() default Integer.MAX_VALUE; String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n"; }
參數分解器
未包含全部代碼
import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; import javax.servlet.http.HttpServletRequest; /** * Created by 12614 on 2018/5/11. */ public class TestArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter methodParameter) { //如果函數包含我們的自定義注解,那就走resolveArgument()函數 return methodParameter.hasParameterAnnotation(Params.class); } @Override public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { System.out.println("TestArgumentResolver:resolveArgument"); Params params = methodParameter.getParameterAnnotation(Params.class); String paramName = params.name(); if (paramName == null) { paramName = methodParameter.getParameterName(); } //簡單的案例:如果客戶端未傳值,就設置默認值 Object res = nativeWebRequest.getNativeRequest(HttpServletRequest.class).getParameter(paramName); return res == null ? params.defaultValue() : res; } }
使用場景
@ResponseBody @RequestMapping("/data") public Map<String, Object> data( @Params(notEmpty = true,maxLength = 30, defaultValue = "aaa") String a) { System.out.println(a); return null; }