используя @LoadBalanced в моей конфигурации и получая ArrayIndexOutOfBoundsException в restTemplate.getMessageConverters () - PullRequest
0 голосов
/ 21 января 2020

Моя конфигурация подобна приведенной ниже:

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass=true)
public class FileStoreBSConfiguration {

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate(new HttpComponentsClientHttpRequestFactory());

    }

, и мой контроллер использует метод ниже:

@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public FileStore upload(@RequestParam("file") MultipartFile inputFile, @PathVariable("tenantId") String tenantId,@RequestParam(value = "replaceFileId" , required = false) Integer replaceFileId ) {

        FormHttpMessageConverter converter = new FormHttpMessageConverter();

        converter.addPartConverter(new FormHttpMessageConverter());


        MultiValueMap<String,Object> parts = new LinkedMultiValueMap<>();

        try {
            parts.add("file", new MultipartInputStreamFileResource(inputFile.getInputStream(), inputFile.getOriginalFilename()));

        } catch (IOException e) {

            throw new ApplicationException("Can't add file to upload", "UPLOADFILEERROR", null);

        }

        return fileStoreService.transferFiles(parts, tenantId, replaceFileId, inputFile, converter);

    }

, и мой класс обслуживания имеет метод ниже, где я не хочу создайте новый RestTamplate (), поскольку он не является LoadBalanced. Однако без создания нового шаблона RestTemplate и если я пытаюсь использовать RestTemaplte с автопроводкой, он не работает. Пожалуйста, предложите подходящее решение о том, как использовать Autowired RestTemplate и использовать restTemplate.getMessageConverters () для этого без исключения ArrayIndexOutOfBoundsException.

@Autowired
RestTemplate restTemplate;

@Autowired
DataServiceLocator dataServiceLocator;

public FileStore transferFiles(MultiValueMap<String, Object> parts, String tenantId, Integer replaceFileId, MultipartFile inputFile, FormHttpMessageConverter converter)   {

    if( converter != null) {
        //TODO : @Autowired isn't working with getMaasegeConverters. If I create new Object then it's not LoadBalanced, as I have used in the configuration So need a way to make this code work without creating a new RestTemplate() here.
        //restTemplate = new RestTemplate();
        restTemplate.getMessageConverters().add(converter);
    }

    HttpHeaders headers = new HttpHeaders();

    headers.setContentType(MediaType.MULTIPART_FORM_DATA);

    String url = dataServiceLocator.getServiceUrl(FILESTORE_DATA_SERVICE, UPLOAD_ACTION, 1);

    HttpEntity<MultiValueMap<String,Object>> request = new HttpEntity<>(parts, headers);

    ResponseEntity response = restTemplate.exchange(
            url,
            HttpMethod.POST,
            request,
            FileStore.class,
            tenantId,
            replaceFileId);


    FileStore resultantFilestore = (FileStore) response.getBody();

    File file = null;

    try {
        file = File.createTempFile("FilestoreBS", ".tmp");

        try (OutputStream outputStream = new FileOutputStream(file);) {

            IOUtils.copy(inputFile.getInputStream(), outputStream);
        }
    } catch (IOException e) {
        logger.error("Error creating temporary file for file transfer", e);
        throw new ApplicationException("Error creating temporary file for file transfer","TEMPORARY_FILE_CREAATION_FAILED",null);
    }
...