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

如何使用MockMvc解决MethodArgumentConversionNotSupportedException?

戎洛华
2023-03-14

我正在为一个控制器方法编写一个单元测试,该方法接受一个MultipartFile和一个自定义对象MessageAttachment。到目前为止,我可以看到MultipartFile是请求的正确格式,但MessageAttachment不是。

通过解析MessageAttture,会抛出服务器端500错误,其中包含METHOARGumentConversionNotSup的dExc0019

这似乎是一个问题,在测试中转换到MockMultipartFile消息附件。这类似于这里显示的示例-https://stackoverflow.com/a/21805186

问题:

如何使用MockMvc解决一个方法ArgumentConversionNotSupport dExcture?

被测控制器方法

 @RequestMapping(value = "/", method = RequestMethod.POST, consumes = "multipart/form-data", produces = "application/json")
        public ResponseEntity<MessageAttachment> handleFileUpload(@RequestParam(value = "file", required = true) MultipartFile file, @RequestParam(value = "messageAttachment") MessageAttachment messageAttachment) {

            //do stuff with the file and attachment passed in..  
            MessageAttachment attachment = new MessageAttachment();

            return ResponseEntity.accepted().header(HttpHeaders.CONTENT_DISPOSITION,
                    "attachment; filename=\"" + file.getOriginalFilename() + "\"").body(attachment);
        }

模拟MVC测试

@Test
public void shouldSaveUploadedFile() throws Exception {


        // Given
        ObjectMapper mapper = new ObjectMapper();

        MessageAttachment messageAttachment = new MessageAttachment();  
        messageAttachment.setTimestamp(new Date());

        MockMultipartFile multipartFile = new MockMultipartFile("file", "test.txt", "text/plain",
                "Spring Framework".getBytes());

        //Mapping the msgAttachment to a MockMultipartFile HERE
        MockMultipartFile msgAttachment = new MockMultipartFile("messageAttachment", "","application/json",
                 mapper.writeValueAsString(messageAttachment).getBytes());

        // When
        this.mockMvc.perform(MockMvcRequestBuilders.multipart("/media/")
                .file(multipartFile)
                .file(msgAttachment)).andDo(MockMvcResultHandlers.print());

}

MockMVCresultHandler的控制台输出。打印()

MockHttpServletRequest:                                                                                                                                                                                                                         
      HTTP Method = POST                                                                                                                                                                                                                        
      Request URI = /media/                                                                                                                                                                                                                     
       Parameters = {}                                                                                                                                                                                                                          
          Headers = {Content-Type=[multipart/form-data]}                                                                                                                                                                                        
             Body = <no character encoding set>                                                                                                                                                                                                 
    Session Attrs = {}                                                                                                                                                                                                                          

Handler:                                                                                                                                                                                                                                        
             Type = com.fizz.buzz.fizzapi.controller.MediaUploadController                                                                                                                                                             
           Method = public org.springframework.http.ResponseEntity<com.fizz.buzz.fizzapi.model.MessageAttachment> com.fizz.buzz.fizzapi.controller.MediaUploadController.handleFileUpload(org.springframework.web.multipart.Mu
ltipartFile,com.fizz.buzz.fizzapi.model.MessageAttachment,javax.servlet.http.HttpServletRequest)                                                                                                                                       

Async:                                                                                                                                                                                                                                          
    Async started = false                                                                                                                                                                                                                       
     Async result = null                                                                                                                                                                                                                        

Resolved Exception:                                                                                                                                                                                                                             
             Type = org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException                                                                                                                                     

ModelAndView:                                                                                                                                                                                                                                   
        View name = null                                                                                                                                                                                                                        
             View = null                                                                                                                                                                                                                        
            Model = null                                                                                                                                                                                                                        

共有1个答案

姚培
2023-03-14

对于请求的application/json部分,您需要使用@RequestPart而不是@RequestParam@RequestPart的javadoc声明

支持的方法参数类型包括MultipartFile和Spring的MultipartResolver抽象、javax。servlet。http。部分与Servlet 3.0多部分请求结合使用,或者对于任何其他方法参数,考虑到请求部分的“内容类型”头,部分内容通过HttpMessageConverter传递。这类似于@RequestBody根据非多部分常规请求的内容解析参数。

请注意,@RequestParam注释还可用于将“多部分/表单数据”请求的一部分与支持相同方法参数类型的方法参数相关联。主要区别在于,当方法参数不是字符串时,@RequestParam依赖于通过注册的转换器或属性编辑器进行的类型转换,@RequestPart依赖于HttpMessageConverters,同时考虑到请求部分的“内容类型”头@RequestParam可能用于名称值表单字段,而@RequestPart可能用于包含更复杂内容的部分(例如JSON、XML)。

假设您没有注册转换器,也没有注册属性编辑器,来解析该部分的内容,而如果类路径上有Jackson,JSON的HttpMessageConverter会自动注册(取决于您的Spring MVC/引导版本)。

 类似资料:
  • 我有一个基本的SpringMVC应用程序,运行(和映射)很好。现在我想用MockMvc设置我的单元测试来执行get请求和其他东西。但如果我运行测试,则会出现断言错误状态: 以下是我的短期测试课程: 所以我希望MockMvc在默认情况下获得DispatcherServlet的位置。但它实际上并不是用来映射的。 我的“web.xml”和“dispatcher servlet.xml”位于“web-IN

  • 我读过其他的解决方案,其中提到创建一个模拟类/对象,我相信我已经用“booksearch mockBookSearch=mockito.mock(booksearch.class);” 我错过了什么?

  • 但是,测试最终出现错误: OBJC[77723]:类JavaLaunchHelper在/library/java/javaVirtualMachines/jdk1.7.0_80.jdk/contents/home/bin/java(0x10bc614c0)和/library/java/javaVirtualMachines/jdk1.7.0_80.jdk/contents/home/jre/lib

  • 问题内容: 我只是写一个小的Ajax框架来实现小项目的可重用性,但是我遇到了一个问题。基本上,我在发送请求时收到’ ‘错误,我不知道发生了什么。 HTML页面(已修剪但显示错误) PHP文件: 完整错误: 我只是看不到哪里出了问题,有什么想法吗? 问题答案: 异常“组件返回的故障代码:0x80070057(NS_ERROR_ILLEGAL_VALUE)”是由于将非法值传递到open方法的调用中引起

  • Values.java AmountDetail.java 当我在postman if子句中点击API时,它工作正常,但如果我想检查else,它会给出错误。我觉得铸造是这里的问题,但我不知道如何返回else块的值。

  • 我正在尝试用Java解决一个ODE,到目前为止,我已经尝试了两个不同的库。我最信任的是Apache Commons Math,然而,即使是简单的问题,我似乎也得不到正确的解。 当我在Mathematica中求解系统时,我得到了这样的结果: 如果我用Apache Commons Math中的Dormand-Prince8(5,3)求解器求解,我会得到以下结果: