Spring boot 配置參數解析器

Spring boot 配置參數解析器

使用場景:將當前登錄的用戶注入到接口參數裏。

例如:

    @RequestMapping(value = "/delete")
    @Transactional
    public ResultInfo deleteUserInfo(@User UserInfo userInfo) {

        return new ResultInfo(ErrCode.OK, "", userInfo.getUsername());
    }

首先創建User註解:

@Documented
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface User {

}

然後創建自定義解釋器,當參數爲UserInfo,且使用User註解標明的參數採用該解釋器進行解釋

@Component
public class UserInfoResolver implements HandlerMethodArgumentResolver {


    private UserInfoService userInfoService;

    public UserInfoResolver(UserInfoService userInfoService) {
        this.userInfoService = userInfoService;
    }

    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.getParameterType().isAssignableFrom(UserInfo.class)
            && methodParameter.hasParameterAnnotation(User.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest,
        WebDataBinderFactory webDataBinderFactory) throws Exception {
        String username;
        try {
            username = (String) nativeWebRequest.getAttribute(Param.USERNAME, RequestAttributes.SCOPE_REQUEST);
        } catch (Exception e) {
            username = null;
        }

        if (username != null) {
            return userInfoService.findOneByUsername(username);
        }
        return new MissingServletRequestPartException(Param.USERNAME);
    }
}

將該解釋器配置在項目中

@Configuration
public class WebConfig extends WebMvcConfigurationSupport {

    private UserInfoService userInfoService;

    @Autowired
    public WebConfig(UserInfoService userInfoService) {
        this.userInfoService = userInfoService;
    }

    @Override
    protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new UserInfoResolver(userInfoService));
    }
}

此時deleteUserInfo(@User UserInfo userInfo)方法中的 userInfo就是當前用戶的信息了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章