当前位置: 首页 > 知识库问答 >
问题:

如何使用RestTemplate Spring Boot发送多部分表单数据并上载PDF

程修雅
2023-03-14

大家好,在我的microservice和spring boot应用程序中,我有一个前端员工microservice,它使用另一个带有文件上传endpoint的microservice。调用服务基于spring rest控制器,我正在尝试在Spring Boot应用程序中使用RestTemplate使用文件上载endpoint。简而言之,尝试上载PDF文件。

我已经探索了以下SO帖子,但它对我不起作用:

jackson在\u empty\u bean上禁用fail\u

我在postman中测试这个并得到以下错误:

组织。springframework。http。转换器。HttpMessageNotWritableException:无法写入内容:找不到类java的序列化程序。io。FileDescriptor,未找到创建BeanSerializer的属性。

如有任何帮助,将不胜感激。。。。

以下是主要组件-

        @RestController 
        
        @RequestMapping(path = “/employee”) 
        

        public class EmployeeController {
            private EmployeeService empService;

            @RequestMapping(value =“/emp/load”, method = RequestMethod.POST)

public
            @ResponseBody
            ResponseEntity<byte[]> handleFileUpload(
        @RequestParam("file") MultipartFile file, @RequestParam String a, @RequestParam String b, @RequestParam String c, @RequestParam String d, @RequestParam String e) throws Exception {
        

return empService.handleFileUpload(file, a, b, c, d, e);
    

            }
        }

服务实现

     @Service
            
     public class EmployeeServiceImpl implements EmployeeService{
            
        @Value(“${emp.base.url}")
                

    private String EMP_BASE_URI;
    

public ResponseEntity<byte[]>handleFileUpload(MultipartFile file, String a, String b, String c, String d, String e) {
    

final String uri = EMP_BASE_URI + "/upload";
    

            RestTemplate restTemplate = getMappedRestTemplate();
    

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

            params.add("file", file);
    

            params.add(“a”, a);
            
    
            params.add(“b”, b);
    

            params.add(“c”, c);
            
    
            params.add(“d”, d);
    

            params.add(“e”, e);

            HttpHeaders headers = new HttpHeaders();
    

            headers.set("Content-Type", "multipart/form-data");

            ResponseEntity<byte[]> response = restTemplate.exchange(uri, HttpMethod.POST, new HttpEntity<>(params, headers), byte[].class);

            return new ResponseEntity<>(response.getBody(), response.getStatusCode());
        }    
             
            
            
                




     private RestTemplate getMappedRestTemplate(){
        

                RestTemplate restTemplate = new RestTemplate();
        

                ObjectMapper newObjectMapper = new ObjectMapper();

                
        newObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false);
                
        
                newObjectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
        

                MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter=new MappingJackson2HttpMessageConverter();

                FormHttpMessageConverter formConvertor = new FormHttpMessageConverter();
                
        
                restTemplate.getMessageConverters().add(formConvertor);
        

                restTemplate.getMessageConverters().add(mappingJacksonHttpMessageConverter);

                restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
                
        
                return restTemplate;
        
            }
    }

无法写入HTTP消息:org。springframework。http。转换器。HttpMessageNotWritableException:无法写入内容:找不到类java的序列化程序。io。未发现创建BeanSerializer的FileDescriptor和属性(为了避免异常,请禁用SerializationFeature.FAIL\u ON\u EMPTY\u bean))(通过引用链:org.springframework.web.multipart.support.StandardMultipartFile[“inputStream”]-

请,任何帮助都要感谢。我已经被困在这一整天了。

共有1个答案

薛飞星
2023-03-14

我已经使用以下方法签名将参数(包括作为字节流的pdf文件,即字节[])作为json发送到请求正文中:

@RequestMapping(value = "/upload", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public @ResponseBody Long handleFileUpload(@Valid @RequestBody Invoice uploadedInvoice){
  ...
}
 类似资料:
  • 我正在尝试用RestTemplate上传一个文件到带有Jetty的Raspberry Pi。在Pi上有一个运行的servlet: 这是我得到的输出: UI-elements.html已上传! org.springframework.web.multipart.support.StandardMultipartTtpServletRequest$StandardMultipartFile@47e76

  • 我想在API正文中以多部分形式发送以下POST请求: 上传传递两个属性(KEY)和(VALUE)发送arquivo(KEY)和(file)如何使用REST-Assured实现这一点 多部分打印https://ibb.co/0QQCkQv 尝试:

  • 这是在服务器端作为接收的内容: 如何转换multipart Confont数据类型中的文章对象?我读到改造可能允许使用转换器为这个。就我对文档的理解而言,它应该是实现的东西。 多部分部件使用的转换器,或者它们可以实现来处理自己的序列化。 null

  • 您好,我想向邮递员发送一个带有json的正文和一个formd数据中的图像。。。 我将表单数据图像保存在s3桶中,实体具有作为图像链接的字符串属性 这里是我的spring boot控制器 我已经用@RequestParam和@RequestPart尝试了多部分文件。。。我收到以下错误: "不支持内容类型'multipart/form-data;边界=-------------------------

  • 不管怎么说,所有的想法和答案都是极其赞赏的。谢谢你的帮助。

  • 问题内容: 我试图发送某种形式而不重新加载页面,并且试图理解幕后细节,因此不使用任何JavaScript库: 调用了upload_file(),但如果我做对了,则不会发送数据。请提供有关发送数据的正确方式的建议。 问题答案: 通过表单传递属性 如果您想获得回覆,可以使用这个 您可以通过或检索所有数据 更新有点晚 至于有关上传的@Varun问题,此代码无法直接处理文件上传,要使用此代码发送文件,您需