Моя конфигурация подобна приведенной ниже:
@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);
}