微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

bytebuddy 将建议应用于接口方法 - 特别是 spring 数据 jpa

如何解决bytebuddy 将建议应用于接口方法 - 特别是 spring 数据 jpa

我正在尝试使用基于字节伙伴的 Java 代理记录在我的 Springboot 应用程序中调用的所有方法

我能够记录除 Spring 数据 JPA 存储库之外的所有层,它们实际上是接口。下面是代理初始化:

        new AgentBuilder.Default()
            .type(ElementMatchers.hasSuperType(nameContains("com.soka.tracker.repository").and(ElementMatchers.isInterface())))
            .transform(new AgentBuilder.Transformer.ForAdvice()
                    .include(TestAgent.class.getClassLoader())
                    .advice(ElementMatchers.any(),"com.testaware.MyAdvice"))
            .installOn(instrumentation);

当我的存储库方法调用时我可以用来记录的任何提示解决方法。下面是一个有问题的示例存储库:

package com.soka.tracker.repository;
.....
@Repository
public interface GeocodeRepository extends JpaRepository<Geocodes,Integer> {
  Optional<Geocodes> findByaddress(String currAddress);
}

修改代理:

    new AgentBuilder.Default()
            .ignore(new AgentBuilder.RawMatcher.ForElementMatchers(any(),isBootstrapClassLoader().or(isExtensionClassLoader())))
            .ignore(new AgentBuilder.RawMatcher.ForElementMatchers(nameStartsWith("net.bytebuddy.")
                    .and(not(ElementMatchers.nameStartsWith(NamingStrategy.SuffixingRandom.BYTE_BUDDY_RENAME_PACKAGE + ".")))
                    .or(nameStartsWith("sun.reflect."))))
            .type(ElementMatchers.nameContains("soka"))
            .transform(new AgentBuilder.Transformer.ForAdvice()
                    .include(TestAgent.class.getClassLoader())
                    .advice(any(),"com.testaware.MyAdvice"))
            //.with(AgentBuilder.Listener.StreamWriting.toSystemOut())
            .with(AgentBuilder.Typestrategy.Default.redefine)
            .installOn(instrumentation);

我看到了关于控制器和服务层的建议 - JPA 存储库层没有被记录。

解决方法

默认情况下,Byte Buddy 会忽略其代理中的合成类型。我假设 Spring 的存储库类被标记为这样,因此不会被处理。

您可以使用 ignore DSL 设置自定义 AgentBuilder 匹配器。默认情况下,以下忽略匹配器设置为忽略系统类和 Byte Buddy 自己的类型:

new RawMatcher.Disjunction(
    new RawMatcher.ForElementMatchers(any(),isBootstrapClassLoader().or(isExtensionClassLoader())),new RawMatcher.ForElementMatchers(nameStartsWith("net.bytebuddy.")
      .and(not(ElementMatchers.nameStartsWith(NamingStrategy.SuffixingRandom.BYTE_BUDDY_RENAME_PACKAGE + ".")))
      .or(nameStartsWith("sun.reflect."))
      .<TypeDescription>or(isSynthetic())))

您可能需要删除最后一个条件。

,

对于访问此问题/问题的任何人 - 我能够通过记录在执行期间调用的实际查询来解决实际问题 - Bytebuddy 非常棒且非常强大 - 例如 - 在我的情况下,我只是 advice'使用我的数据库连接池类并收集所有必需的遥测数据 -

.or(ElementMatchers.nameContains("com.zaxxer.hikari.pool.HikariProxyConnection"))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。