转载自: https://blog.csdn.net/nnsword/article/details/76260355 https://blog.csdn.net/Rylan11/article/details/79433192
HandlerMethodArgumentResolver是用来为处理器解析参数的,主要用在HandlerMethod中,每个Resolver对应一种类型的参数。
1 2 3 4 5 6 7 8 9 10 public interface HandlerMethodArgumentResolver { // 用于判断是否支持对某种参数的解析 boolean supportsParameter(MethodParameter parameter); // 将请求中的参数值解析为某种对象 @Nullable Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception; }
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public class UserMethodArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { if(parameter.getParameterType() != null && parameter.getParameterType().equals(User.class)){ return true; }else { return false; } } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { Authentication authentication = SecurityContextHolder.getContext() .getAuthentication(); if (authentication == null) { return null; } Object principal = authentication.getPrincipal(); if (principal != null && !parameter.getParameterType().isAssignableFrom(User.class)) { User userDetails = (User)principal; return userDetails; } return principal; } }
1 2 3 4 5 6 7 8 @Configuration public class WebParameterConfig extends WebMvcConfigurerAdapter { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { argumentResolvers.add(new UserMethodArgumentResolver()); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 @RequestMapping("/"+IndexController.Mapping_Url) @Controller public class IndexController { public static final String Mapping_Url="manage"; @RequestMapping(value = {"/",""}) public String index(Model model, Authentication authentication,User user){ model.addAttribute("title","userweb"); //输出登录提示信息 //System.out.println("管理员 " + user.getUsername() + " 进入"); return Mapping_Url+"/index"; } }
HandlerMethodReturnValueHandler是RequestMappingHandlerAdapter用来处理完映射控制类,对方法返回的值进一步进行处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public interface HandlerMethodReturnValueHandler { /** * 该处理程序是否支持给定的方法返回类型(只有返回true才回去调用handleReturnValue) */ boolean supportsReturnType(MethodParameter returnType); /** * 处理给定的返回值 * 通过向 ModelAndViewContainer 添加属性和设置视图或者 * 通过调用 ModelAndViewContainer.setRequestHandled(true) 来标识响应已经被直接处理(不再调用视图解析器) */ void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception; }
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class MyHandlerMethodReturnValueHandler implements HandlerMethodReturnValueHandler { @Override public boolean supportsReturnType(MethodParameter returnType) { return returnType.getParameterType() == Person.class; } @Override public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception { Assert.isInstanceOf(Person.class, returnValue); //标识请求是否已经在该方法内完成处理 mavContainer.setRequestHandled(true); // 获取方法上的注解 PersonAnnotation personAnnotation = returnType.getMethodAnnotation(PersonAnnotation.class); HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class); response.setContentType("text/plain;charset=UTF-8"); Person person = (Person) returnValue; response.getWriter().println(personAnnotation.value() + ":" + person); } }
1 2 3 4 5 6 7 8 @Controller public class DemoController { @PersonAnnotation("person") @RequestMapping(value = "/demo", method = RequestMethod.GET) public Person getPerson() { return new Person("xiya", 25); } }
同样,在WebMvcConfigurerAdapter中,重写addReturnValueHandlers方法即可。