新聞中心
spring參數(shù)解析器,讓你的方法入?yún)⒏鼉?yōu)雅
曾幾何時(shí),我們編程從原始時(shí)代進(jìn)入石器時(shí)代,開始擁有使用工具的思想,于是大量的工具,util和腳手架開始像雨后春筍似的出現(xiàn),spring字如其名,像春天一樣,奠定了萬(wàn)物復(fù)蘇的基石,于是基于spring的大量框架開始出現(xiàn),如springMvc,springboot,springcloud等,生態(tài)一時(shí)無(wú)兩。作為使用spring多年的老用戶,總是會(huì)好奇我們?cè)谑褂瞄_發(fā)的各種功能,于是像貓一樣的探索,挖掘,模仿讓人著謎的各種設(shè)計(jì)。今天分享參數(shù)解析器,實(shí)現(xiàn)像@RequestBody一樣的功能,一個(gè)注解自動(dòng)注入想要參數(shù)的方法解析器實(shí)戰(zhàn)。廢話不多說(shuō),直接上代碼!

成都創(chuàng)新互聯(lián)公司是網(wǎng)站建設(shè)專家,致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營(yíng)銷,專業(yè)領(lǐng)域包括成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、電商網(wǎng)站制作開發(fā)、微信小程序定制開發(fā)、微信營(yíng)銷、系統(tǒng)平臺(tái)開發(fā),與其他網(wǎng)站設(shè)計(jì)及系統(tǒng)開發(fā)公司不同,我們的整合解決方案結(jié)合了恒基網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗(yàn)和互聯(lián)網(wǎng)整合營(yíng)銷的理念,并將策略和執(zhí)行緊密結(jié)合,且不斷評(píng)估并優(yōu)化我們的方案,為客戶提供全方位的互聯(lián)網(wǎng)品牌整合方案!
功能背景描述:
在開發(fā)中,經(jīng)常會(huì)用到在控制層的對(duì)外請(qǐng)求接口入?yún)⒅校Mㄟ^(guò)一個(gè)注解來(lái)注入當(dāng)前登錄用戶信息,從而在接口功能下行過(guò)程中,能夠一直傳下去,來(lái)實(shí)現(xiàn)用戶信息的獲取
實(shí)現(xiàn)步驟如下:
定義當(dāng)前登錄用戶類 CurrentUser:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 描述:當(dāng)前登錄用戶
* 作者:IT學(xué)習(xí)道場(chǎng)
* 時(shí)間:2022-11-15 19:07
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CurrentUser {
private Long userId;
private String userName;
}
自定義注解:
import java.lang.annotation.*;
/**
* 描述:自定義用戶注解
* 作者:IT學(xué)習(xí)道場(chǎng)
* 時(shí)間:2022-11-15 16:56
*/
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WlcUser {
}
當(dāng)前用戶解析器:
import com.example.demo.annotation.WlcUser;
import com.example.demo.po.CurrentUser;
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;
/**
* 描述:當(dāng)前用戶解析器
* 作者:IT學(xué)習(xí)道場(chǎng)
* 時(shí)間:2022-11-15 17:01
*/
public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
//方法參數(shù)是否帶有 WlcUser注解,帶的話就解析執(zhí)行下方 resolveArgument 方法
return parameter.hasParameterAnnotation(WlcUser.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
//1 這里面可以從httpHeader中獲取用戶標(biāo)識(shí)或者其他屬性值,也可以通過(guò)springIoc中bean來(lái)執(zhí)行增刪改查,rpc來(lái)獲取,但是要用spring的上下文來(lái)獲取bean
//2 也可以從token中解析出當(dāng)前登錄用戶信息,返回也行對(duì)象 CurrentUser
//3 也可以從你自己定義的用戶上下文中獲取 CurrentUser,前提你要自己寫一個(gè)用戶上下文
//4 這里調(diào)用sprinIoc里管理的bean的話,需要 SpringContextUtil上下文來(lái)獲取bean,在調(diào)用方法
//5 這里只是自己new了一個(gè)當(dāng)前用戶,來(lái)直接賦予加了 WlcUser 注解修飾的對(duì)象
CurrentUser currentUser = new CurrentUser(1L,"老王");
return currentUser;
}
}
把參數(shù)解析器注入到mvc中:
import com.example.demo.resolver.CurrentUserMethodArgumentResolver;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
/**
* 描述:web攔截器,解析器配置類
* 作者:IT學(xué)習(xí)道場(chǎng)
* 時(shí)間:2022-11-15 19:09
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(Listresolvers) {
resolvers.add(new CurrentUserMethodArgumentResolver());
}
}
現(xiàn)在測(cè)試controller測(cè)試實(shí)現(xiàn):
import com.example.demo.annotation.WlcUser;
import com.example.demo.po.CurrentUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 描述:參數(shù)解析解TestController
* 作者:IT學(xué)習(xí)道場(chǎng)
* 時(shí)間:2022-11-16 9:25
*/
@Slf4j
@RestController
@RequestMapping("/currentUserResolver")
public class CurrentUserResolverController {
@GetMapping("/currentUserResolve")
public void currentUserResolve(@WlcUser CurrentUser user){
log.info("參數(shù)解析器注入 CurrentUser = {}", user.toString());
}
}
請(qǐng)求下,控制臺(tái)日志:
參數(shù)解析自動(dòng)注入成功!自己動(dòng)手豐衣足食,去玩玩吧!
分享題目:SpringMvc參數(shù)解析器,讓你的方法入?yún)⒏鼉?yōu)雅
文章分享:http://m.fisionsoft.com.cn/article/codgeje.html


咨詢
建站咨詢
