我有一堆运行在纯JDK上的Web服务,我需要拦截所有公共方法才能执行某些操作。一些方法使用@WebParam批注。使用ByteBuddy子类化WebService会从覆盖方法中删除@WebParam批注,并且该服务将无法正常工作。

这是样本签名

public Something fetch( @WebParam( name="Query" ) QueryCriteria query )

这就是我使用ByteBuddy的方式
new ByteBuddy( )
    .subclass( implementationClass )
    .method( isPublic( ).and( isDeclaredBy( implementationClass ) ) )
    .intercept(
            MethodDelegation.to( new WebServiceInterceptor( ) )
            .andThen( SuperMethodCall.INSTANCE ) )
    .annotateType( implementationClass.getAnnotations( ) )
    .make( )

我知道有一种方法可以注释参数,但是它需要有关方法参数的特殊知识(因为仅注释了一些参数)。我想做的就是让ByteBuddy与超类完全一样地注释我的类,包括所有重写方法的所有参数。
subclass( implementationClass )
.annotateType( LIKE_SUPERCLASS )
.method( )
.intercept( ... )
.annotateMethod( LIKE_SUPER_INCLUDING_PARAMS )

有任何想法吗?

BR,帕奇

最佳答案

设法自己找到解决方案。

new ByteBuddy( )
    .withAttribute( new TypeAttributeAppender.ForInstrumentedType( AnnotationAppender.ValueFilter.AppendDefaults.INSTANCE ) )
    .withDefaultMethodAttributeAppender( new MethodAttributeAppender.ForInstrumentedMethod(AnnotationAppender.ValueFilter.AppendDefaults.INSTANCE ) )

会成功的

Br,Paci

09-04 06:35