springboot自定義參數解析HandlerMethodArgumentResolver


自定義解析器需要實現HandlerMethodArgumentResolver接口,HandlerMethodArgumentResolver接口包含兩個接口函數:

public interface HandlerMethodArgumentResolver { boolean supportsParameter(MethodParameter var1); @Nullable Object resolveArgument(MethodParameter var1, @Nullable ModelAndViewContainer var2, NativeWebRequest var3, @Nullable WebDataBinderFactory var4) throws Exception; } 

自定義一個解析器CurrentUserMethodArgumentResolver

我們在解析器中返回一個固定的UserBeannew UserBean(1L,"admin"),實際情況是從Session、數據庫或者緩存中查。

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; /** * 用於綁定@CurrentUser的方法參數解析器 * * @author lism */ public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver { public CurrentUserMethodArgumentResolver() { } @Override public boolean supportsParameter(MethodParameter parameter) { if (parameter.getParameterType().isAssignableFrom(UserBean.class) && parameter.hasParameterAnnotation(CurrentUser.class)) { return true; } return false; } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { CurrentUser currentUserAnnotation = parameter.getParameterAnnotation(CurrentUser.class); //從Session 獲取用戶 Object object = webRequest.getAttribute(currentUserAnnotation.value(), NativeWebRequest.SCOPE_SESSION); //從 accessToken獲得用戶信息 if (object == null) { String token = webRequest.getHeader("Authorization"); if (token == null) { token = webRequest.getParameter("accessToken"); } //為了測試先寫死用戶名 //TODO: 取真實用戶 return new UserBean(1L,"admin"); } return object; } } 

自定義注解@CurrentUser

import java.lang.annotation.*; /** * <p>綁定當前登錄的用戶</p> * <p>不同於@ModelAttribute</p> * * @author lism */ @Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface CurrentUser { /** * 當前用戶在request中的名字 * * @return */ String value() default "user"; } 

在控制器中使用@CurrentUser

在控制器方法上加入@CurrentUser UserBean userBean即可自動注入userBean的值

@RestController @RequestMapping(value = "/test") public class TestController { /** * 根據name查詢 * * @param request * @return */ @RequestMapping(value = "/testCurrentUser", method = RequestMethod.POST, produces = "application/json", consumes = "application/json") @ResponseBody public void test(@CurrentUser UserBean userBean, @RequestBody SubjectRequest request) { String createdBy = userBean.getUsername(); log.info(createdBy); } } 

User實體UserBean

import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; @Data @NoArgsConstructor @AllArgsConstructor public class UserBean implements Serializable { private Long id; private String username; } 

總結

我們可以通過實現HandlerMethodArgumentResolver接口來實現對自定義的參數進行解析。
比如可以解析自定義的時間格式、自定義解析Map對象等這些spring原本不支持的對象格式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM