You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMeter Java Request调用Micronaut客户端时DependencyInjectionException问题

解决JMeter Java Request调用Micronaut Client时的属性解析异常

问题根源

IntelliJ运行正常是因为IDE环境下Micronaut的配置加载和属性解析流程完整,但打包为fat jar在JMeter中运行时,Micronaut的属性占位符解析机制未正确触发,或JMeter类加载环境干扰了配置读取。

具体解决方案

  • 显式硬编码配置,绕过占位符
    直接在代码中设置超时属性,不依赖配置文件的占位符解析。例如创建HttpClient时指定:

    HttpClient client = HttpClient.create(new URL("http://your-service-url"));
    client.configuration().setReadTimeout(Duration.ofSeconds(10));
    

    或者构建ApplicationContext时直接注入属性:

    ApplicationContext ctx = ApplicationContext.builder()
        .defaultEnvironments("test")
        .property("micronaut.config-client.read-timeout", "10s")
        .build();
    
  • 确保配置文件被正确加载

    1. 打包时将application.yml放到fat jar的META-INF/resources目录下,确保Micronaut能扫描到。
    2. 启动JMeter时通过JVM参数指定配置文件路径,修改jmeter.sh(或jmeter.bat),添加:
      JVM_ARGS="-Dmicronaut.config.files=/absolute/path/to/your/application.yml"
      
  • 禁用不必要的Config Client模块
    如果测试不需要Micronaut的配置客户端功能,直接禁用它:

    • 在application.yml中添加:
      micronaut:
        config-client:
          enabled: false
      
    • 或者在构建脚本中排除依赖:
      Gradle:
      implementation("io.micronaut:micronaut-http-client") {
          exclude group: "io.micronaut", module: "micronaut-config-client"
      }
      
      Maven:
      <dependency>
          <groupId>io.micronaut</groupId>
          <artifactId>micronaut-http-client</artifactId>
          <exclusions>
              <exclusion>
                  <groupId>io.micronaut</groupId>
                  <artifactId>micronaut-config-client</artifactId>
              </exclusion>
          </exclusions>
      </dependency>
      
  • 自定义PropertySource注入属性
    在代码中手动添加自定义属性源,强制注入该属性值:

    import io.micronaut.context.ApplicationContext;
    import io.micronaut.context.env.MapPropertySource;
    import java.util.HashMap;
    import java.util.Map;
    import java.time.Duration;
    import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
    import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
    import org.apache.jmeter.samplers.SampleResult;
    import io.micronaut.http.client.HttpClient;
    
    public class YourJMeterSampler extends AbstractJavaSamplerClient {
        @Override
        public SampleResult runTest(JavaSamplerContext context) {
            SampleResult result = new SampleResult();
            result.sampleStart();
            
            Map<String, Object> customConfig = new HashMap<>();
            customConfig.put("micronaut.config-client.read-timeout", Duration.ofSeconds(10));
            
            ApplicationContext ctx = ApplicationContext.builder()
                    .propertySources(MapPropertySource.of("jmeter-custom-config", customConfig))
                    .build();
            
            try {
                HttpClient client = ctx.getBean(HttpClient.class);
                // 执行测试请求逻辑
                result.setSuccessful(true);
            } catch (Exception e) {
                result.setSuccessful(false);
                result.setResponseMessage(e.getMessage());
            } finally {
                ctx.close();
                result.sampleEnd();
            }
            return result;
        }
    }
    
  • 调整JMeter类加载策略
    将Micronaut核心依赖(如micronaut-core、micronaut-http-client等)复制到JMeter的lib/ext目录下,而非打包到自己的fat jar中,避免类加载冲突导致配置解析失败。

内容的提问来源于stack exchange,提问作者Test

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 23:42:33