当前位置: 首页 > 知识库问答 >
问题:

如何在spring集成(DSL)中公开“内容配置”?

常朗
2023-03-14

下载文件时,我会将“内容配置”添加到我的responseHeader中,但它不起作用。

响应不会有任何添加的属性。

    @Bean
    public ExpressionParser fileParser() {
        return new SpelExpressionParser();
    }

    @Bean
    public HeaderMapper<HttpHeaders> fileHeaderMapper() {
        return new DefaultHttpHeaderMapper();
    }
@Bean
    public IntegrationFlow httpGetFileDownload() {
        return IntegrationFlows.from(
                Http.inboundGateway("/api/files/download/{id}")
                        .requestMapping(r -> r.methods(HttpMethod.GET))
                        .statusCodeExpression(fileParser().parseExpression("T(org.springframework.http.HttpStatus).BAD_REQUEST"))
                        .payloadExpression(fileParser().parseExpression("#pathVariables.id"))
                        .crossOrigin(cors -> cors.origin("*").exposedHeaders("Content-Disposition", "content-disposition"))
                        .headerMapper(fileHeaderMapper())
                )
                .channel("http.file.download.channel")
                .handle("fileEndpoint", "download")
                .get();
    }



public Message<?> download(Message<Long> msg){
...

return MessageBuilder
                    .withPayload(resource)
                    .copyHeaders(msg.getHeaders())
                    .setHeader(STATUSCODE_HEADER, HttpStatus.OK)
                    .setHeader(HttpHeaders.CONTENT_DISPOSITION,"attachment;filename=" + file.getName())
                    .setHeader(HttpHeaders.CONTENT_TYPE, mimeType)
                    .setHeader(HttpHeaders.CONTENT_LENGTH, (int)file.length())
                    .build();
}


我得到的:

cache-control:"no-cache, no-store, max-age=0, oble-revaltify"
content-type:"Application/json"
过期:"0"
pragma:"no-cache"

共有1个答案

谷梁宁
2023-03-14

您的问题是DefaultHttpHeaderMapper默认为空。我认为可能是时候将ctor设为已弃用以不允许从最终应用程序使用它。或者进行一些验证以拒绝只是空的(未配置)DefaultHttpHeaderMapper...

同样令人困惑的是,使用返回新的DefaultHttpHeaderMapper()有什么意义 如果您没有自定义它。HttpRequestHandlingMessagingGateway中有一个默认值:

private HeaderMapper<HttpHeaders> headerMapper = DefaultHttpHeaderMapper.inboundMapper();

为了解决您的问题,您肯定需要使用这个inboundMapper()factory方法,它可以实现以下功能:

/**
 * Factory method for creating a basic inbound mapper instance.
 * This will map all standard HTTP request headers when receiving an HTTP request,
 * and it will map all standard HTTP response headers when sending an HTTP response.
 * @return The default inbound mapper.
 */
public static DefaultHttpHeaderMapper inboundMapper() {
    DefaultHttpHeaderMapper mapper = new DefaultHttpHeaderMapper();
    setupDefaultInboundMapper(mapper);
    return mapper;
}

setupDefaultInboundMapper()非常重要:它为我们带来了一组从请求映射到响应的头。

 类似资料:
  • 如何在下面的JUnit类中运行integrationFlow?目前出现了例外情况 因为整合流没有启动。 JUnit类: }

  • 我无法解决这个问题,现在已经坚持了很长时间。我是一个spring-integration-dsl的初学者,任何帮助都将非常感谢。

  • 我正在使用Spring Boot(打包到没有SpringBoot运行程序的经典WAR),我想在Spock中实现集成测试。当我使用时,只使用标准Spring上下文(没有从Boot获得任何好处,例如。

  • 我已经建立了一个简单的Spring集成流程,该流程由以下步骤组成: 然后定期轮询一个rest api 对有效载荷做一些处理 并将其置于Kafka主题上。 请遵守以下代码: 这非常有效,然而,我正在努力想出一些好的测试。 我应该如何模拟外部RESTAPI

  • 使用石英2.2.2 Spring 4.2.4.释放 如何给我配置石英?,只用阳极化全部 启动我的系统好吗 问题包含2 jobFactory for system public SchedulerFactoryBean SchedulerFactoryBean()方法的第一个构建是另一个类的第二个构建,我想是Spring! 我的Quartz配置属性是: 我尝试使用和bean“springQuartz

  • 我有一个要求,我需要保存/缓冲在通道上接收到的消息,并根据消息数量或超时意味着1分钟内没有接收到消息而持久化在数据库中。有没有办法在Spring集成中实现这一点