Как я могу раскрыть «Content-Disposition» в Spring-интеграции (DSL)? - PullRequest
1 голос
/ 29 июня 2019

Для загрузки файла я добавлю «Content-Disposition» в мой 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();
}


Что я получаю:

контроль кеша: "no-cache, no-store, max-age = 0, must-revalidate"
тип содержимого: "application / json"
expires: "0"
pragma: "no-cache"

1 Ответ

1 голос
/ 01 июля 2019

Ваша проблема в том, что DefaultHttpHeaderMapper пусто по умолчанию. Я думаю, что настало время сделать ctor как deprecated, чтобы не допустить его использования из конечного приложения. Или сделать некоторую проверку, чтобы отклонить просто пусто (не настроено) DefaultHttpHeaderMapper ...

Также сбивает с толку, какой смысл использовать это return new DefaultHttpHeaderMapper();, если вы не настраиваете его. В HttpRequestHandlingMessagingGateway есть значение по умолчанию:

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

Чтобы исправить вашу проблему, вам обязательно нужно использовать фабричный метод inboundMapper(), который делает это:

/**
 * 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() очень важно: оно предоставляет нам набор заголовков для сопоставления запроса и ответа.

...