最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Resttemplate上傳文件500異常的原因及解決方法

 更新時(shí)間:2024年08月20日 09:43:50   作者:NullInfo  
使用 Resttemplate 調(diào)用 DMS 文件服務(wù)器 Http 接口,出現(xiàn) 500 異常報(bào)錯(cuò),所以本文給大家介紹了Resttemplate上傳文件500異常的原因及解決方法,需要的朋友可以參考下

一、問(wèn)題背景

使用 Resttemplate 調(diào)用 DMS 文件服務(wù)器 Http 接口,出現(xiàn) 500 異常報(bào)錯(cuò)

二、問(wèn)題描述

通過(guò) ClientHttpRequestInterceptor 攔截器設(shè)置 ContentType 和 BasicAuth 后,調(diào)用DMS 文件服務(wù)器 Http 接口,出現(xiàn) 500 異常報(bào)錯(cuò)

三、相關(guān)代碼

Resttemplate 及自定義 ClientHttpRequestInterceptor Bean 對(duì)象代碼

@Bean(name = "dmsRestTemplate")
public RestTemplate restTemplate(
    @Qualifier("dmsRequestInterceptor") ClientHttpRequestInterceptor dmsRequestInterceptor) {
    RestTemplate restTemplate = new RestTemplate();
    ((AllEncompassingFormHttpMessageConverter) restTemplate.getMessageConverters().get(4))
        .setMultipartCharset(StandardCharsets.UTF_8);
    restTemplate.getInterceptors().add(dmsRequestInterceptor);
    restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
        @Override
        public boolean hasError(ClientHttpResponse response) throws IOException {
            return super.hasError(response.getStatusCode())
                && !HttpStatus.NOT_FOUND.equals(response.getStatusCode());
        }

        @Override
        public void handleError(ClientHttpResponse response) throws IOException {
            super.handleError(response);
        }
    });
    return restTemplate;
}

@Bean
public ClientHttpRequestInterceptor dmsRequestInterceptor(FileStorageProperties fileStorageProperties) {
    String userName = fileStorageProperties.getDms().getUserName();
    String password = fileStorageProperties.getDms().getPassword();
    return (request, body, execution) -> {
        HttpHeaders headers = request.getHeaders();
        MediaType type = MediaType.parseMediaType(MediaType.MULTIPART_FORM_DATA_VALUE);
        headers.setContentType(type);
        headers.setBasicAuth(userName, password, StandardCharsets.UTF_8);
        return execution.execute(request, body);
    };
}

文件上傳代碼

@Override
public FileStorageBO upload(String filePath) throws BaseAppException {
    LOGGER.debug("DMSFileStorage upload by file path start.");
    if (StringUtils.isEmpty(fileStorageProperties.getDms().getRestUrl())) {
        LOGGER.error("DMS rest url config not exist!");
        ExceptionHandler.publish("EPA-COMMON-0010", ExceptionHandler.BUSS_ERROR);
    }
    File tempFile = new File(filePath);
    FileStorageBO result = new FileStorageBO(tempFile);
    MultiValueMap<String, Object> postParameters = new LinkedMultiValueMap<>();
    FileSystemResource resource = new FileSystemResource(tempFile.getAbsolutePath());
    postParameters.add("file", resource);
    postParameters.add("shardingkey", "EPA_" + getShardingKey());
    HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(postParameters);
    try {
        String dmsId = dmsRestTemplate.postForObject(fileStorageProperties.getDms().getRestUrl() + "/file",
            httpEntity, String.class);
        result.setFileIdentity(dmsId);
        LOGGER.debug("DMSFileStorage upload by file path end. dms id is {}", dmsId);
    }
    catch (RestClientException e) {
        LOGGER.error(e);
        ExceptionHandler.publish("EPA-COMMON-0011", ExceptionHandler.BUSS_ERROR, e.getLocalizedMessage());
    }

    return result;
}

四、問(wèn)題原因

攔截器中設(shè)置 ContentType 為 multipart/form-data 時(shí),無(wú)法自動(dòng)生成 boundary 信息,導(dǎo)致無(wú)法根據(jù)該分隔符信息來(lái)解析請(qǐng)求體

在使用multipart/form-data格式發(fā)送HTTP請(qǐng)求時(shí),請(qǐng)求體的數(shù)據(jù)會(huì)被分割成多個(gè)部分,每個(gè)部分之間使用一個(gè)特定的分隔符(boundary)進(jìn)行分隔。這個(gè)boundary是在Content-Type頭部中指定的,用于告訴服務(wù)器如何識(shí)別每個(gè)部分的開(kāi)始和結(jié)束。

當(dāng)使用RestTemplate發(fā)送multipart/form-data請(qǐng)求時(shí),RestTemplate會(huì)自動(dòng)處理boundary的生成和添加到請(qǐng)求的Content-Type頭部中。這樣服務(wù)器就能夠正確解析請(qǐng)求體中的各個(gè)部分。

使用RestTemplate構(gòu)建multipart/form-data請(qǐng)求時(shí),只需設(shè)置正確的Content-Typemultipart/form-data,RestTemplate會(huì)負(fù)責(zé)生成請(qǐng)求體的各個(gè)部分,并在Content-Type頭部中添加正確的boundary信息。

不需要手動(dòng)追加boundary到請(qǐng)求體中,RestTemplate會(huì)在內(nèi)部處理這一細(xì)節(jié),確保請(qǐng)求能夠正確地被服務(wù)器解析。

因此,使用RestTemplate發(fā)送multipart/form-data請(qǐng)求時(shí),只需設(shè)置正確的Content-Typemultipart/form-data,RestTemplate會(huì)負(fù)責(zé)處理boundary的生成和添加,確保請(qǐng)求能夠正確發(fā)送到服務(wù)器并被正確解析。

通常情況下,Content-Type的設(shè)置應(yīng)該由發(fā)送請(qǐng)求的代碼負(fù)責(zé),而不是在ClientHttpRequestInterceptor中進(jìn)行設(shè)置。ClientHttpRequestInterceptor主要用于在發(fā)送請(qǐng)求之前或之后對(duì)請(qǐng)求進(jìn)行修改或處理,例如添加認(rèn)證信息、日志記錄、錯(cuò)誤處理等。

五、問(wèn)題修復(fù)

將 ContentType 移到上傳代碼中

攔截器 Bean:

@Bean
public ClientHttpRequestInterceptor dmsRequestInterceptor(FileStorageProperties fileStorageProperties) {
    String userName = fileStorageProperties.getDms().getUserName();
    String password = fileStorageProperties.getDms().getPassword();
    return (request, body, execution) -> {
        HttpHeaders headers = request.getHeaders();
        headers.setBasicAuth(userName, password, StandardCharsets.UTF_8);
        return execution.execute(request, body);
    };
}

上傳代碼:

@Override
public FileStorageBO upload(String filePath) throws BaseAppException {
    LOGGER.debug("DMSFileStorage upload by file path start.");
    if (StringUtils.isEmpty(fileStorageProperties.getDms().getRestUrl())) {
        LOGGER.error("DMS rest url config not exist!");
        ExceptionHandler.publish("EPA-COMMON-0010", ExceptionHandler.BUSS_ERROR);
    }
    File tempFile = new File(filePath);
    FileStorageBO result = new FileStorageBO(tempFile);
    MultiValueMap<String, Object> postParameters = new LinkedMultiValueMap<>();
    FileSystemResource resource = new FileSystemResource(tempFile.getAbsolutePath());
    postParameters.add("file", resource);
    postParameters.add("shardingkey", "EPA_" + getShardingKey());
    HttpHeaders headers = new HttpHeaders();
    MediaType type = MediaType.parseMediaType(MediaType.MULTIPART_FORM_DATA_VALUE);
    headers.setContentType(type);
    HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(postParameters, headers);
    try {
        String dmsId = dmsRestTemplate.postForObject(fileStorageProperties.getDms().getRestUrl() + "/file",
            httpEntity, String.class);
        result.setFileIdentity(dmsId);
        LOGGER.debug("DMSFileStorage upload by file path end. dms id is {}", dmsId);
    }
    catch (RestClientException e) {
        LOGGER.error(e);
        ExceptionHandler.publish("EPA-COMMON-0011", ExceptionHandler.BUSS_ERROR, e.getLocalizedMessage());
    }

    return result;
}

以上就是Resttemplate上傳文件500異常的原因及解決方法的詳細(xì)內(nèi)容,更多關(guān)于Resttemplate上傳文件500的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot基于FFmpeg實(shí)現(xiàn)壓縮視頻切片為m3u8

    SpringBoot基于FFmpeg實(shí)現(xiàn)壓縮視頻切片為m3u8

    本文介紹了一個(gè)使用FFmpeg將MP4視頻壓縮切片為HLS格式M3U8文件的Java工具類,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2026-02-02
  • Spring MultipartFile實(shí)現(xiàn)多文件上傳攻略

    Spring MultipartFile實(shí)現(xiàn)多文件上傳攻略

    這篇文章主要介紹了Spring MultipartFile實(shí)現(xiàn)多文件上傳,MultipartFile是Spring框架中用于處理文件上傳的核心接口,MultipartFile的使用需注意文件驗(yàn)證和錯(cuò)誤處理,以保證系統(tǒng)的穩(wěn)定性和安全性,需要的朋友可以參考下
    2025-10-10
  • springmvc如何使用POJO作為參數(shù)

    springmvc如何使用POJO作為參數(shù)

    這篇文章主要介紹了springmvc如何使用POJO作為參數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java復(fù)習(xí)之集合框架總結(jié)

    Java復(fù)習(xí)之集合框架總結(jié)

    本篇文章主要介紹了Java復(fù)習(xí)之集合框架總結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • java實(shí)現(xiàn)京東登陸示例分享

    java實(shí)現(xiàn)京東登陸示例分享

    這篇文章主要介紹了使用java實(shí)現(xiàn)的京東商城登陸示例,需要的朋友可以參考下
    2014-03-03
  • springboot配置文件屬性變量引用方式${}和@@用法及區(qū)別說(shuō)明

    springboot配置文件屬性變量引用方式${}和@@用法及區(qū)別說(shuō)明

    這篇文章主要介紹了springboot配置文件屬性變量引用方式${}和@@用法及區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 我們來(lái)說(shuō)說(shuō)Java LockSupport 的 park 和 unpark

    我們來(lái)說(shuō)說(shuō)Java LockSupport 的 park 和 unpa

    LockSupport是JDK底層線程阻塞工具,通過(guò)park/unpark實(shí)現(xiàn)線程阻塞與喚醒,避免死鎖,與Object的wait/notify相比,無(wú)需監(jiān)視器,支持先unpark后park,且更精確控制線程狀態(tài),是AQS等同步器的核心基礎(chǔ),本文介紹Java LockSupport 的 park 和 unpark,感興趣的朋友一起看看吧
    2025-07-07
  • 如何為Repository添加自定義方法

    如何為Repository添加自定義方法

    這篇文章主要介紹了如何為Repository添加自定義方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java字符串如何只保留數(shù)字、字母、中文

    java字符串如何只保留數(shù)字、字母、中文

    這篇文章主要介紹了java字符串如何只保留數(shù)字、字母、中文問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Idea插件安裝和管理方式

    Idea插件安裝和管理方式

    這篇文章主要介紹了Idea插件安裝和管理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評(píng)論

揭西县| 彝良县| 泽普县| 合山市| 石屏县| 文化| 宜章县| 梅州市| 阜平县| 泽普县| 海丰县| 易门县| 岗巴县| 宁安市| 宜宾县| 巩留县| 萍乡市| 丰顺县| 南充市| 枣强县| 杭锦后旗| 和平区| 万载县| 湘乡市| 衡南县| 来凤县| 铜山县| 芜湖市| 徐水县| 绥阳县| 嘉定区| 惠水县| 乌恰县| 昌吉市| 三台县| 吉水县| 乃东县| 正阳县| 腾冲县| 五原县| 许昌市|