Springboot ClientHttpRequestInterceptor: получить тип объекта запроса - PullRequest
0 голосов
/ 22 декабря 2019

Я работаю над проектом springboot, где мне нужно перехватить исходящие http-запросы и что-то с этим сделать. Я знаю, что мы можем использовать ClientHttpRequestInterceptor для того же самого, и он тоже отлично работает.

Но мне нужно знать тип java-класса тела запроса, отправляемого в http POST / PUTзапрос. В настоящее время этот перехватчик предоставляет только представление байтового массива объекта запроса. Док здесь

Есть ли какой-нибудь способ узнать тип java-объекта / тела запроса? Или есть какой-то другой лучший способ сделать это, кроме использования ClientHttpRequestInterceptor?

Обновленный пример кода:

public class MyInterceptor implements ClientHttpRequestInterceptor {


@Override
public ClientHttpResponse intercept(HttpRequest request,
                             byte[] body,
                             ClientHttpRequestExecution execution)
                      throws IOException {

// Do something before service invocation

// I need to get request body's class type but it is just a byte[] here. And the 'HttpRequest' argument doesn't carry any info related to request class type.

ClientHttpResponse clientHttpResponse = execution.execute(request, body);

// Do something after service invocation    
  }
}

1 Ответ

0 голосов
/ 27 декабря 2019

Конечно, вы можете, рекомендуемый способ сделать это;использует ِ Аспектно-ориентированное программирование AOP , которое предоставит вам всю необходимую информацию о намеченном JointPoint;в вашем случае это будет метод, вызываемый внутри контроллера.

Проверьте этот пример Spring Boot AOP , а также лучше запачкать руку этими классами ProceedingJoinPoint и JointPoint

Чтобы упростить его, вы можете использовать этот класс JointPoint для получения сигнатуры метода и, конечно, его параметров, для каждого параметра у вас также есть тип(который вы ищете), кроме того, вы можете использовать сам параметр для выполнения любой логики, которая вам нужна. проверьте следующее

@Aspect
@Component
public class SomeAspect {

    @Around("@annotation(SomeAnnotation)")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
        CodeSignature codeSignature = (CodeSignature) joinPoint.getSignature();

        System.out.println("Parameters' Types: " + codeSignature.getParameterTypes);
        System.out.println("Parameters' name: " + codeSignature.getParameterNames()[0]);
        System.out.println("Arguments' value: " + joinPoint.getArgs());

        return joinPoint.proceed();
    }
}

Другой способ, который может помочь вам в вашем коде, - это использование чистого отражения и пользовательских аннотаций. Таким образом, вы также можете получить все детали из класса вашего запроса,но это может потребовать еще немного кода.

...