从Spring RestDocs生成的Spring合同:忽略标题

时间:2018-10-30 08:30:56

标签: spring-cloud-contract spring-restdocs

TL; DR:我在this issue上发表了评论,并被要求打开一张新票,但是后来意识到这更多的是问题,因为Spring RestDocs提供了一种实现我想要的方式的方法(忽略合同中不重要的标头) )和operation preprocessor。因此,我们就在友好的SoF上

问题是我试图从RestDocs测试开始生成合同(如果重要,请使用RestAssuredjunit5)。测试设置(在Kotlin中)如下:

private val defaultDocument = document("{method_name}", SpringCloudContractRestDocs.dslContract())
lateinit var spec: RequestSpecification
@BeforeEach
internal fun setUp(restDocumentationContextProvider: RestDocumentationContextProvider) {
    RestAssured.port = port
    spec = RequestSpecBuilder()
        .setConfig(
            RestAssuredConfig.config()
                .objectMapperConfig(
                    ObjectMapperConfig.objectMapperConfig()
                        .jackson2ObjectMapperFactory { _, _ -> mapper }
                )
        )
        .addFilter(defaultDocument)
        .addFilter(ResponseLoggingFilter())
        .log(LogDetail.ALL)
        .build()
}

其中mapperport作为Spring Bean注入。

服务器生成一个Date头,这是生成响应的时间。 Spring WebMvc是自动完成的(我认为),我根本不关心该标头。但是,Date头会导致存根生成失败,因为我决定使用Spring Cloud Contracts in a polyglot world approach来生成存根并将其上载到maven存储库,因为现在服务器生成了另一个日期。

正如我指出的hereContractDslSnippet似乎没有提供一种忽略不重要的标头和/或添加匹配器的方法(这仍然是一个悬而未决的问题)。

(简短的)问题列表:

  • 如何从生成的合同中过滤掉不重要的标头?
  • 我可以像为主体添加标题一样添加自定义匹配器吗?

1 个答案:

答案 0 :(得分:0)

如何使用Spring RestDocs preprocessors删除不重要的标头:

private val defaultDocument = document("{method_name}", SpringCloudContractRestDocs.dslContract())
lateinit var spec: RequestSpecification
@BeforeEach
internal fun setUp(restDocumentationContextProvider: RestDocumentationContextProvider) {
    RestAssured.port = port
    spec = RequestSpecBuilder()
        .setConfig(
            RestAssuredConfig.config()
                .objectMapperConfig(
                    ObjectMapperConfig.objectMapperConfig()
                        .jackson2ObjectMapperFactory { _, _ -> mapper }
                )
        )
        .addFilter(
            documentationConfiguration(restDocumentationContextProvider)
                .operationPreprocessors()
                .withResponseDefaults(Preprocessors.removeMatchingHeaders("Date"))
        )
        .addFilter(defaultDocument)
        .addFilter(ResponseLoggingFilter())
        .log(LogDetail.ALL)
        .build()
}

重要的部分是添加一个新的过滤器(第一个过滤器),该过滤器需要配置Spring RestDocs来从其所有代码段(包括合同代码段)中删除Date

如何使用默认的SpringCloudContractRestDocs.dslContract()添加自定义匹配器:我现在暂时还无法实现,但是这里可能是错误的(如果有人可以鸣叫并以防万一,我很高兴)