SpringMVC의 Body 매개변수 차단 문제

SpringMVC는 출참과 입참에 대해 매우 우호적인 확장 지원을 가지고 데이터의 입력과 출력에 대해 더욱 큰 집행권을 가지도록 합니다. 우리는 어떻게 SpringMVC가 정의한 결과를 통해 일련의 처리를 합니까?
입참하다
RequestBodyAdvice: @RequestBody로 처리되는 모든 매개변수
참조 사례: JsonViewRequestBodyAdvice

public class JsonViewRequestBodyAdvice extends RequestBodyAdviceAdapter {

  /**
   *  , true beforeBodyRead , 
   * @param methodParameter
   * @param targetType
   * @param converterType
   * @return
   */
  @Override
  public boolean supports(MethodParameter methodParameter, Type targetType,
      Class<? extends HttpMessageConverter<?>> converterType) {
        
    return (AbstractJackson2HttpMessageConverter.class.isAssignableFrom(converterType) &&
        methodParameter.getParameterAnnotation(JsonView.class) != null);
  }

    //  ...  @JsonView 
  @Override
  public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter methodParameter,
      Type targetType, Class<? extends HttpMessageConverter<?>> selectedConverterType) throws IOException {

    JsonView annotation = methodParameter.getParameterAnnotation(JsonView.class);
    Class<?>[] classes = annotation.value();
    if (classes.length != 1) {
      throw new IllegalArgumentException(
          "@JsonView only supported for request body advice with exactly 1 class argument: " + methodParameter);
    }
    return new MappingJacksonInputMessage(inputMessage.getBody(), inputMessage.getHeaders(), classes[0]);
  }
}
출삼
ResponseBodyAdvice: @ResponseBody의 모든 매개 변수를 처리합니다.
참조 사례:

@ControllerAdvice
public class LogResponseBodyAdvice implements ResponseBodyAdvice {
 
  /**
   *
   * @param returnType
   * @param converterType
   * @return
   */
  @Override
  public boolean supports(MethodParameter returnType, Class converterType) {
    return true;
  }

  @Override
  public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
    //   body  , 
    return body; 
  }
}

주의사항
사용자 정의 처리 대상 클래스에 @ControllerAdvice 메모를 추가해야 합니다!
왜?
원본 중RequestMappingHandlerAdapter 클래스가 실행되고 있습니다initControllerAdviceCache() 초기화할 때 하나를 실행합니다.

List<ControllerAdviceBean> beans = ControllerAdviceBean.findAnnotatedBeans(getApplicationContext());
AnnotationAwareOrderComparator.sort(beans);
Controller Advice Bean.findAnnotatedBeans 방법은 클래스에 Controller Advice 주석이 있는 클래스를 찾아야 처리에 추가됩니다..

public static List<ControllerAdviceBean> findAnnotatedBeans(ApplicationContext applicationContext) {
    List<ControllerAdviceBean> beans = new ArrayList<ControllerAdviceBean>();
    for (String name : BeanFactoryUtils.beanNamesForTypeIncludingAncestors(applicationContext, Object.class)) {
      if (applicationContext.findAnnotationOnBean(name, ControllerAdvice.class) != null) {
        beans.add(new ControllerAdviceBean(name, applicationContext));
      }
    }
    return beans;
  }

그래서 여러분은 자신의 필요에 따라 결과의 입참과 출참 결과를 정의하여 특수한 처리를 할 수 있습니다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기