如何在 ClientRequestFilter 中获取 MicroProfile REST Client 注释

how to get MicroProfile REST Client annotation in ClientRequestFilter

我的 RestClient 由自定义注释进行注释,我想在 ClientRequestFilter 中获取注释值。

这是我的 MicroProfile RestClient:

@Path("/greetings")
@RegisterRestClient
@MyAnnotation("myValue") 
public interface MyRestClient{

  @GET
  public String hello();
}

我想在我的 ClientRequestFilter 中获取注释值:

public class MyFilter implements ClientRequestFilter {

  @Override
  public void filter(ClientRequestContext requestContext) {
   // Here i want to get the MyAnnotation value. i.e "myValue"
  }
}

我试图调用 requestContext.getClient().getAnnotations() 方法,但它不起作用,因为 requestContext.getClient()org.jboss.resteasy.microprofile.client.impl.MpClient

的一个实例

有问题的实现是 RESTEasy。我想找到一种方法从 RESTEasy 经典实现和 RESTEasy 响应式实现中获取这些信息。

感谢您的帮助

这应该有效:

import org.jboss.resteasy.client.jaxrs.internal.ClientRequestContextImpl;

import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.ext.Provider;

@Provider
public class MyFilter implements ClientRequestFilter {
    @Override
    public void filter(ClientRequestContext requestContext) {
        Class<?> declaringClass = ((ClientRequestContextImpl) requestContext)
            .getInvocation()
            .getClientInvoker()
            .getDeclaring();

        MyAnnotation myAnnotation = declaringClass.getAnnotation(MyAnnotation.class);
        System.out.println(myAnnotation.value());
    }
}

顺便提一下,这确实是 RESTEasy 特有的。 class ClientRequestContextImpl 来自内部 RESTEasy 包,因此可能会有所变化。

这里是 MicroProfile REST Client specific way:

@Provider
public class MyFilter implements ClientRequestFilter {
   
  public void filter(final ClientRequestContext clientRequestContext) {
    
    final Method method = (Method) clientRequestContext
                              .getProperty("org.eclipse.microprofile.rest.client.invokedMethod");
    
    Class<?> declaringClass = method.getDeclaringClass();
    System.out.println(declaringClass);

    MyAnnotation myAnnotation = declaringClass.getAnnotation(MyAnnotation.class);
    System.out.println(myAnnotation.value());
  }
}

它必须适用于所有实现,包括 RESTEasy(经典和反应式)或 Apache CXF。