-1

我正在开发一个 springboot 项目,我需要拦截传出的 http 请求并对其进行处理。我知道我们可以使用 ClientHttpRequestInterceptor 来做同样的事情,它也可以正常工作。

但我需要知道在 http POST/PUT 请求中发送的请求体的java 类类型。目前这个拦截器只提供请求对象的字节数组表示。文档在这里

有什么方法可以了解请求对象/主体的 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    
  }
}
4

2 回答 2

0

byte[] 是您的请求对象的序列化形式。仅仅通过手头的 byte[] 块不会帮助您确定它是哪种类的 Object。你需要做更多的事情 -

如果您正在为您的 RestTemplate 实现 ClientHttpRequestInterceptor 并且您必须对您的请求对象做一些事情 - 那么您必须将 byte[] 正文转换为您的对象:

如何 - Java:对象到字节 [] 和字节 [] 到对象转换器(东京内阁)

一旦你手头有一个对象,然后使用 instanceof 检查转换后的 Object 是否属于你的类:

if(obj instanceof Your_Class){
   // your class specific code ..
}
于 2020-07-20T05:51:52.497 回答
-1

当然可以,推荐的做法;正在使用 ِAspect Oriented Programming AOP,它将为您提供有关您所针对的 JointPoint 所需的所有详细信息;在您的情况下,它将是控制器内部调用的方法。

检查这个例子Spring Boot AOP,最好用这些类ProceedingJoinPointJointPoint弄脏你的手

为简单起见,您可以使用此 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();
    }
}

另一种可能对您的代码有所帮助的方法是使用纯反射和自定义注释,这样您还可以从您的请求的 Class 中获取所有详细信息,但它可能需要更多代码。

于 2019-12-27T18:28:15.097 回答