以下是代码段; 基本上,当错误代码不是200时,我试图传播异常.
ResponseEntity<Object> response = restTemplate.exchange(url.toString().replace("{version}", version),
HttpMethod.POST, entity, Object.class);
if(response.getStatusCode().value()!= 200){
logger.debug("Encountered Error while Calling API");
throw new ApplicationException();
}
Run Code Online (Sandbox Code Playgroud)
但是,如果来自服务器的500响应,我将获得异常
org.springframework.web.client.HttpServerErrorException: 500 Internal Server Error
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]
Run Code Online (Sandbox Code Playgroud)
我真的需要在try中包装其余的模板交换方法吗?那么代码的目的是什么?
我正在使用Spring 3和RestTemplate.我基本上有两个应用程序,其中一个必须将值发布到另一个应用程序.通过休息模板.
当要发布的值是字符串时,它的工作完美,但是当我必须发布混合和复杂的参数(如MultipartFiles)时,我会得到转换器异常.
例如,我有这个:
App1 - PostController:
@RequestMapping(method = RequestMethod.POST)
public String processSubmit(@ModelAttribute UploadDTO pUploadDTO,
BindingResult pResult) throws URISyntaxException, IOException {
URI uri = new URI("http://localhost:8080/app2/file/receiver");
MultiValueMap<String, Object> mvm = new LinkedMultiValueMap<String, Object>();
mvm.add("param1", "TestParameter");
mvm.add("file", pUploadDTO.getFile()); // MultipartFile
Map result = restTemplate.postForObject(uri, mvm, Map.class);
return "redirect:postupload";
}
Run Code Online (Sandbox Code Playgroud)
另一方面......我有另一个Web应用程序(App2)从App1接收参数.
App2 - ReceiverController
@RequestMapping(value = "/receiver", method = { RequestMethod.POST })
public String processUploadFile(
@RequestParam(value = "param1") String param1,
@RequestParam(value = "file") MultipartFile file) {
if (file == null) {
System.out.println("Shit!... …Run Code Online (Sandbox Code Playgroud) 我有一个Web服务调用,通过它可以上传zip文件.然后将文件转发到另一个服务进行存储,解压缩等.现在文件存储在文件系统中,然后构建FileSystemResource.
Resource zipFile = new FileSystemResource(tempFile.getAbsolutePath());
Run Code Online (Sandbox Code Playgroud)
我可以使用ByteStreamResource以节省时间(在转发之前不需要在磁盘上保存文件)但是为此我需要构建一个字节数组.如果是大文件,我将收到"OutOfMemory:java heap space"错误.
ByteArrayResource r = new ByteArrayResource(inputStream.getBytes());
Run Code Online (Sandbox Code Playgroud)
任何使用RestTemplate转发文件而不会出现OutOfMemory错误的解决方案?
我有一个客户端需要将大量的大型json文件POST到服务器.我已经能够通过将每个文件读入内存并使用RestTemplate发布整个文件来实现它.但是,客户端快速耗尽处理大型json文件的内存.我想切换到流式方法,但无法弄清楚如何正确使用RestInmplate的FileInputStream.我发现了这个问题,并使用了接受的答案中给出的代码,但我仍然看到内存使用和OutOfMemory异常使我相信它不是流式传输文件,但仍然完全将它们读入内存.我究竟做错了什么?这是我目前的情况:
final InputStream fis = ApplicationStore.class.getResourceAsStream(path);
final RequestCallback requestCallback = new RequestCallback() {
@Override
public void doWithRequest(final ClientHttpRequest request) throws IOException {
request.getHeaders().add("Content-type", "application/json");
IOUtils.copy(fis, request.getBody());
}
};
final RestTemplate restTemplate = new RestTemplate();
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);
restTemplate.setRequestFactory(requestFactory);
final HttpMessageConverterExtractor<String> responseExtractor =
new HttpMessageConverterExtractor<String>(String.class, restTemplate.getMessageConverters());
restTemplate.execute("http://" + host + ":8080/upads-data-fabric" + "/ruleset", httpMethod, requestCallback, responseExtractor);
Run Code Online (Sandbox Code Playgroud) 在我的Spring启动应用程序中,我需要将String值与MultipartFile一起传递为Requestparam.
控制器位于我将MultipartFile转换为的地方java.io.File,然后在帮助下将其传递给DAO控制器restTemplate.
从角请求将先打上传控制器然后UploadController是客户端(JAVA),这将是调用服务器SVS-BA-道控制器与基本URL.
csvUpload包含基本URL:http:// localhost:8082/svs-ba-dao/csvUpload?parentPkId =&file = multipartFile
@CrossOrigin
@RestController
public class UploadController {
private static final Logger log = LogManager.getLogger(UploadController.class);
@Value("${salama.dao.csvUpload.rest.url}")
private String csvUpload;
@Autowired
UploadHelperService uploadHelperService;
@PostMapping(value = "/csvUpload")
public String csvUpload(@QueryParam("parentPkId") String parentPkId, @RequestParam("file") MultipartFile file ) throws IllegalStateException, IOException{
log.info("Calling csvUpload :" + csvUpload);
final HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
File cnvFile = uploadHelperService.multipartToFile(file,file.getOriginalFilename());
System.out.println("Converted File Name is -->"+cnvFile.getName());
final …Run Code Online (Sandbox Code Playgroud) 我想在我的Spring Boot应用程序中实现上传处理程序方法.我想用CommonsMultipartResolver而不是StandardServletMultipartResolver.我有以下问题:
我的控制器方法参数(文件)始终设置为null.我在java文档中看到HiddenHttpMethodFilter:
由于需要检查POST body参数,因此在多部分POST请求的情况下,此过滤器需要在多部分处理之后运行.
我试图为multipartFilter bean设置顺序,但它没有帮助.当我调试时,我发现HiddenHttpMethodFilter之前总是调用它MultipartFilter.我使用的是Spring Boot 1.3.0.RELEASE和基于Java的配置.如何设置的顺序 HiddenHttpMethodFilter来之后MultipartFilter?
@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setMaxUploadSizePerFile(52428800);
return resolver;
}
@Bean
@Order(0)
public MultipartFilter multipartFilter() {
MultipartFilter multipartFilter = new MultipartFilter();
multipartFilter.setMultipartResolverBeanName("multipartResolver");
return multipartFilter;
}
@RequestMapping(value = "/{userId}", method = RequestMethod.POST)
@ResponseBody
public FileTransport create(@PathVariable("userId") Long userId,
MultipartFile file) throws IOException {
//return fileService.create(userId, file);
return new FileTransport();
}
Run Code Online (Sandbox Code Playgroud)
如果我修改方法以包括如下所示的请求参数:
@RequestParam(name …
resttemplate ×5
spring ×4
java ×3
spring-boot ×2
spring-mvc ×2
file-upload ×1
groovy ×1
rest ×1