SpringBoot 통합 사용자 정의 HandlerMethodArgument Resolver 매개 변수 초기 값 분석

7688 단어 springboot주해
더 읽 기
대부분https://www.cnblogs.com/yangzhilong/p/7605889.html。
전통 적 인 SpringMVC 통합 사용자 정의 HandlerMethodArgument Resolver 방식 은 다음 과 같 습 니 다.http://www.cnblogs.com/yangzhilong/p/6282218.html
SpringBoot 에 서 는 파일 화 를 설정 합 니 다. 구체 적 인 방법 은 다음 과 같 습 니 다.
1. 시작 클래스 계승 WebMvcConfigurerAdapter
2. WebMvcConfigurerAdapter 를 계승 하기 위해 @ Configuration 주 해 를 따로 작성 합 니 다 (추천)
import java.util.List;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.longge.LoginUserInfoMethodArgumentResolver;

@SpringBootApplication
public class MyBootApplication extends WebMvcConfigurerAdapter{
    public static void main(String[] args) {
        SpringApplication.run(MyBootApplication.class, args);
    }
    
    @Override
    public void addArgumentResolvers(List argumentResolvers) {
        super.addArgumentResolvers(argumentResolvers);
        argumentResolvers.add(new LoginUserInfoMethodArgumentResolver());
    }
}

 
import org.apache.commons.lang3.StringUtils;
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 com.longge.utils.Constant;
import com.longge.utils.RedisCacheUtils;

/**
 *      session dto
 */
public class LoginUserInfoMethodArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public Object resolveArgument(MethodParameter arg0, ModelAndViewContainer arg1, NativeWebRequest arg2,
            WebDataBinderFactory arg3) throws Exception {
        String token = arg2.getHeader(Constant.TOKEN_KEY);
        if(StringUtils.isNotBlank(token)) {
            return RedisCacheUtils.getUserInfo(token);
        }
        return null;
    }

    @Override
    public boolean supportsParameter(MethodParameter arg0) {
        return arg0.getParameterType().equals(UserInfo.class);
    }

}

 사용 방법:
@ApiOperation("  ")
@PutMapping("add")
public ResponseResult add(UserInfo userInfo, @Valid @RequestBody SupplierDto supplierDto) {
    //    UserInfo        ,  LoginUserInfoMethodArgumentResolver  class       
}

 위 에 서 는 클 라 스 류 를 직접 사용 하 는 방식 이 고, 다음은 주해 방식 으로 이 루어 집 니 다.
import java.lang.annotation.*;

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

}

 
import com.chinamobile.annation.CurrentUser;
import com.chinamobile.dto.CurrentUserData;
import com.chinamobile.util.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.util.StringUtils;
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;


public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {

    @Autowired
    private RedisUtil redisUtil;

    public CurrentUserMethodArgumentResolver() {
    }

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(CurrentUser.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        String accessToken = webRequest.getHeader("authorization");
        if (StringUtils.isEmpty(accessToken)) {
            return null;
        }

        Object object = redisUtil.get(accessToken);
        if (object instanceof CurrentUserData) {
            return object;
        }
        return null;
    }
}

 이곳 의 RedisUtil 은 redis 의 처리 류 로 스스로 실현 하면 된다.
import com.CurrentUserMethodArgumentResolver;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
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;

@Configuration
@Slf4j
public class ApiConfig extends WebMvcConfigurerAdapter {

    /**
     *      bean
     *
     * @return
     */
    @Bean
    public CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver() {
        return new CurrentUserMethodArgumentResolver();
    }

    @Override
    public void addArgumentResolvers(List argumentResolvers) {
        argumentResolvers.add(currentUserMethodArgumentResolver());
    }

}

 아래 와 같이 사용:
/**
     *       
     *
     * @param userId
     * @param addUserModel
     * @param currentUserData
     * @return
     */
    @PutMapping(value = "/users/{userId}")
    public CommonResponse updateUser(@PathVariable("userId") Integer userId,
                                             @RequestBody AddUserModel addUserModel, 
                                             @CurrentUser CurrentUserData currentUserData) {

        CommonResponse commonResponse = new CommonResponse<>();
        try {
            Integer updateBy = currentUserData.getUserId();
            //     
            if (userId == null) {
                commonResponse.setCode(ResponseCode.PARAMETER_ERROR);
                commonResponse.setMsg("       ,        ");
                log.info("Parameter check failed.");
            }else {
                commonResponse.setCode(ResponseCode.SUCCESS);
                commonResponse.setMsg("      .");
                log.info("Update user info success.");
            }
        } catch (Exception ex) {
            log.error("SERVER_ERROR: " + ex);
            commonResponse.setCode(ResponseCode.SERVER_ERROR);
            commonResponse.setMsg("SERVER_ERROR");
        }
        return commonResponse;
    }

좋은 웹페이지 즐겨찾기