Controller 인덱스 간소화(HandlerMethodArgumentResolver)

8135 단어 코드 간소화
장면: MVC 3층 프레임워크에서 Controller 층은 항상 대상을 전송하는데 이런 대상은 항상 검사를 필요로 한다.
간단한 매개 변수 검사는 일반적으로 대상의 변수가 비어 있지 않고 길이가 제한되어 있음을 가리키며, 다른 글을 참고할 수 있습니다: @Validated 매개 변수 검사를 간소화할 수 있습니다
추천 읽기:HandlerMethodArgumentResolver의 간단한 사용
핵심: HandlerMethodArgumentResolver 해상도, 기능: Request 요청 파라미터를 분석하고 데이터를 Controller에 연결하는 인삼
핵심:
  • 사용자 정의 방법 매개 변수 해석기HandlerMethodArgumentResolver 인터페이스
  • 구성에 이 파서를 추가합니다. addArgumentResolvers
  • Controller층이 방법 매개 변수HttpServletRequest、Model에 주입될 수 있는 것도 이 원리이다

    사용자 정의 메소드 매개변수 파서

    HandlerMethodArgumentResolver 인터페이스에 두 가지 방법이 있습니다.
    public interface HandlerMethodArgumentResolver {
        boolean supportsParameter(MethodParameter parameter);
    
        Object resolveArgument(MethodParameter parameter, 
                               ModelAndViewContainer mavContainer,
    						NativeWebRequest webRequest, 
                               WebDataBinderFactory binderFactory) 
            throws Exception;
    }
    

    방법1: supportsParameter
    boolean supportsParameter(MethodParameter parameter);
    

    명의를 보고 매개 변수가 목표류인지 아닌지를 판단한다.네,true로 돌아가야 다른 방법으로 처리됩니다.
    일반적으로 두 가지 프로세스가 있습니다.
  • 클래스 판단
    Class<?> clazz = parameter.getParameterType();
    return clazz == xxx.class;
    //clazz.isAssignableFrom(xxx.class);
    //clazz instanceof xxx.class ...
    
    에 따라 첨부: isAssignableFrom()와 instanceof의 차이
  • 주해에 따라 판단
    boolean res = parameter.hasParameterAnnotation(xxx.class);
    return res;
    
  • 탁: 둘 다 같이 쓸 수 있어요.
    eg: 클래스 a에 따라 판단하지만 각Controller마다 판단하는 것이 아니라면 주해 b를 사용자 정의하고 판단을 추가합니다.
    return parameter.getParameterType().isAssignableFrom(a.class)
                 && parameter.hasParameterAnnotation(b.class);
    

    방법2. resolveArgument
     Object resolveArgument(MethodParameter parameter, 
                               ModelAndViewContainer mavContainer,
    						NativeWebRequest webRequest, 
                               WebDataBinderFactory binderFactory) 
            throws Exception;
    

    이 방법의 매개 변수 중 비교적 많이 사용하는 것은 webRequest인데 구체적인 Request류를 획득하여 매개 변수를 얻는다.더 나아가 판단하다.(다른 매개 변수는 필자도 잘 모르고 관련 자료도 검색하지 못하면 반문에서 도끼질하지 않는다.)
    HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
    		HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
    
    request.getParameter(xxx);
    

    구성에 추가

    @Configuration
    public class WebConfig  extends WebMvcConfigurerAdapter{
    	// HandlerMethodArgumentResolver , 
        //  , @Autowired, spring ,@Component、@Service 
    	@Autowired
    	UserArgumentResolver userArgumentResolver;
    	
    	@Override
    	public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
            // 
    		argumentResolvers.add(userArgumentResolver);
    	}
    }
    

    핵심은 addArgumentResolvers 방법이다.
    반드시 이 부류를 계승하는 것이 아니라 다른 부류도 이 방법이 있다. 예를 들어WebMvcConfigurationSupport 이런 방법은 비교적 완전하다.
    자세한 사용법과 사례는 참고할 수 있습니다:HandlerMethodArgumentResolver는 현재 로그인 사용자를 통일적으로 얻는 데 사용됩니다.
    참고 자료:
    Spring 사용자 정의argumentResolver 매개변수 파서
    본문 이 끝나면 잘못 지적한 것 을 환영합니다

    좋은 웹페이지 즐겨찾기