I handled adding definitionTransformer to ServletListener by extending and overriding the WireMockWebContextListener
This keeps the configuration stock as much as possible and uses Spring features to auto-register new Transformers without any other config change. Using latest wiremock artifact 2.26.3
Below is complete setup config and implementation.
public abstract class AbstractResponseDefinitionTransformer extends ResponseDefinitionTransformer implements Extension {
@Override
public String getName() {
return WordUtils.uncapitalize(getClass().getSimpleName());
}
}
@Component
public class CustomResponseDefinitionTransformer extends AbstractResponseDefinitionTransformer {
@Override
public ResponseDefinition transform(Request request, ResponseDefinition responseDefinition, FileSource files,
Parameters parameters) {
System.out.println("Hello World !!!");
return responseDefinition;
}
}
public class CustomWireMockWebContextListener extends WireMockWebContextListener {
private static final String APP_CONTEXT_KEY = "WireMockApp";
private final List<? extends AbstractResponseDefinitionTransformer> abstractResponseDefinitionTransformers;
public CustomWireMockWebContextListener() {
this(Collections.emptyList());
}
public CustomWireMockWebContextListener(
List<? extends AbstractResponseDefinitionTransformer> abstractResponseDefinitionTransformers) {
this.abstractResponseDefinitionTransformers = abstractResponseDefinitionTransformers;
}
@Override
public void contextInitialized(ServletContextEvent sce) {
super.contextInitialized(sce);
final ServletContext context = sce.getServletContext();
final WarConfiguration warConfiguration = buildCustomWarConfiguration(context);
final WireMockApp wireMockApp = new WireMockApp(warConfiguration, new NotImplementedContainer());
context.setAttribute(APP_CONTEXT_KEY, wireMockApp);
context.setAttribute(StubRequestHandler.class.getName(), wireMockApp.buildStubRequestHandler());
context.setAttribute(AdminRequestHandler.class.getName(), wireMockApp.buildAdminRequestHandler());
}
private WarConfiguration buildCustomWarConfiguration(final ServletContext context) {
final Map<String, Extension> map = abstractResponseDefinitionTransformers.stream()
.collect(Collectors.toMap(AbstractResponseDefinitionTransformer::getName, transformer -> transformer));
return new WarConfiguration(context) {
@Override
public <T extends Extension> Map<String, T> extensionsOfType(Class<T> extensionType) {
return (Map<String, T>) Maps.filterEntries(map, valueAssignableFrom(extensionType));
}
};
}
}
@Configuration
public class WireMockConfiguration {
@Autowired
private List<? extends AbstractResponseDefinitionTransformer> abstractResponseDefinitionTransformers;
@Bean
public ServletListenerRegistrationBean wireMockWebContextListener() {
final ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean();
bean.setEnabled(true);
bean.setListener(new CustomWireMockWebContextListener(abstractResponseDefinitionTransformers));
return bean;
}
}