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

如何在主类中调用ResponseDefinitionTransformer?已尝试实现该类

在主类中调用ResponseDefinitionTransformer的方法

首先咱们得明确,ResponseDefinitionTransformer是WireMock生态里用来自定义响应转换的扩展类,要让你写的Stub生效,得先完成注册Transformer,再在Stub配置里指定使用它。下面一步步来实操:


1. 先完善你的Stub实现

先把你没写完的代码补全,另外记得给Transformer起个唯一标识名(WireMock靠这个名字识别它),重写getName()方法就能实现:

public class Stub extends ResponseDefinitionTransformer {
    FileOutputStream fos;
    String path;
    File file;
    byte[] message;
    boolean value;

    // 给Transformer起个唯一名字,后续调用要用到
    @Override
    public String getName() {
        return "custom-body-saver-transformer";
    }

    @Override
    public ResponseDefinition transform(Request rqst, ResponseDefinition rd, FileSource fs, Parameters params) {
        message = rqst.getBody();
        path = "C:/Users/xxx/Documents/NetBeansProjects/WeatherApplication/xmlFile.xml";
        file = new File(path);
        try {
            fos = new FileOutputStream(file);
            fos.write(message);
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
            // 异常时可以返回500错误响应,避免服务挂掉
            return new ResponseDefinitionBuilder().withStatus(500).build();
        }
        // 处理完请求体后,返回原始响应(也可以自定义修改响应内容)
        return rd;
    }
}

2. 在主类中注册并使用Transformer

接下来在主类里,启动WireMock时要把这个自定义Transformer注册进去,然后在创建Stub规则时指定使用它:

方式一:用独立WireMock服务器实例

如果是用独立服务器模式:

import com.github.tomakehurst.wiremock.WireMockServer;
import static com.github.tomakehurst.wiremock.client.WireMock.*;

public class MainClass {
    public static void main(String[] args) {
        // 1. 创建服务器并注册你的Transformer
        WireMockServer wireMockServer = new WireMockServer(wireMockConfig().extensions(new Stub()));
        wireMockServer.start();

        // 2. 配置客户端指向服务器
        configureFor("localhost", wireMockServer.port());

        // 3. 定义Stub规则时指定使用Transformer
        stubFor(post(urlEqualTo("/your-api-endpoint"))
                .willReturn(aResponse()
                        .withTransformer("custom-body-saver-transformer") // 对应你之前定义的名字
                        .withStatus(200)
                        .withBody("请求体已成功保存!")));

        // 后续可以添加测试请求、服务监控等逻辑
    }
}

方式二:用WireMock静态配置模式

如果习惯用静态启动方式:

import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
import static com.github.tomakehurst.wiremock.client.WireMock.*;

public class MainClass {
    public static void main(String[] args) {
        // 1. 启动WireMock并注册Transformer
        startServer(wireMockConfig().extensions(new Stub()));

        // 2. 定义Stub规则
        stubFor(post(urlEqualTo("/your-api-endpoint"))
                .willReturn(aResponse()
                        .withTransformer("custom-body-saver-transformer")
                        .withStatus(200)
                        .withBody("请求已处理")));
    }
}

3. 关键注意事项

  • 名称必须完全匹配:withTransformer()里的字符串,要和Stub类中getName()返回的名字一模一样,否则WireMock找不到你的转换器。
  • 异常要妥善处理:transform()方法里的IO操作一定要捕获异常,避免因为文件写入失败导致整个WireMock服务崩溃。
  • 可自定义响应:如果需要修改返回给客户端的响应内容,不用直接返回原始的rd,可以用ResponseDefinitionBuilder构建新的响应返回。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:46:19