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

是否可以在具有RequestBody和RequestPart的控制器中定义一个endpoint?

徐洛华
2023-03-14

我需要创建一个接受RequestBody或RequestPart的单个endpoint。

如果请求包含RequestPart,它将执行一些逻辑来处理MultipartFile,否则它将处理RequestBody中传递的对象。

@RequestMapping(value="/xyz/api/{endPoint}", method= RequestMethod.POST)
public void endPointPost(
        @PathVariable String endPoint,
        HttpServletRequest request,
        HttpServletResponse response,
        @RequestBody(required=false) Object body,
        @RequestPart(required=false) MultipartFile uploadFile) throws Exception {

{“body”:{“companycd”:“mytest”}}

但是,当发送多部分请求时,它会失败,并出现以下错误:

2019-10-18 00:50:43,440 DEBUG [http-nio-8080-exec-8] org.springframework.web.servlet.handler.AbstractHandlerMapping: Mapped to public void com.monoplus.mcd.rest.GenericController.endPointPost(java.lang.String,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse,java.lang.Object,org.springframework.web.multipart.MultipartFile) throws java.lang.Exception
2019-10-18 00:50:43,440 INFO  [http-nio-8080-exec-8] com.monoplus.mcd.rest.ServletControllerInterceptor: ServletControllerInterceptor - preHandle
2019-10-18 00:50:43,442 DEBUG [http-nio-8080-exec-8] org.springframework.web.method.support.InvocableHandlerMethod: Could not resolve parameter [3] in public void com.monoplus.mcd.rest.GenericController.endPointPost(java.lang.String,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse,java.lang.Object,org.springframework.web.multipart.MultipartFile) throws java.lang.Exception: Content type 'multipart/form-data;boundary=----WebKitFormBoundaryG1Xr4xtC2rNYWuCd;charset=UTF-8' not supported
2019-10-18 00:50:43,446 DEBUG [http-nio-8080-exec-8] org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: Using @ExceptionHandler public final org.springframework.http.ResponseEntity<java.lang.Object> org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler.handleException(java.lang.Exception,org.springframework.web.context.request.WebRequest) throws java.lang.Exception
2019-10-18 00:50:43,481 DEBUG [http-nio-8080-exec-8] org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor: No match for [text/html, application/xhtml+xml, image/webp, image/apng, application/signed-exchange;v=b3, application/xml;q=0.9, */*;q=0.8], supported: []
2019-10-18 00:50:43,482 DEBUG [http-nio-8080-exec-8] org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver: Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;boundary=----WebKitFormBoundaryG1Xr4xtC2rNYWuCd;charset=UTF-8' not supported]
2019-10-18 00:50:43,483 INFO  [http-nio-8080-exec-8] com.monoplus.mcd.rest.ServletControllerInterceptor: ServletControllerInterceptor - afterCompletion - org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryResponseWrapper@6c9a1e05
2019-10-18 00:50:43,484 DEBUG [http-nio-8080-exec-8] org.springframework.web.servlet.FrameworkServlet: Completed 415 UNSUPPORTED_MEDIA_TYPE

请注意,无法解析参数[3]...引用了RequestBody参数。

    null
Host: localhost:88
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------262541039624932
Content-Length: 1401
Connection: keep-alive
Referer: http://localhost:88/appl/html/master/FileImport.html
Cookie: JSESSIONID=3f052417-1702-48b6-b7c2-cac5609ef525; SESSION=M2YwNTI0MTctMTcwMi00OGI2LWI3YzItY2FjNTYwOWVmNTI1
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache
    null
-----------------------------262541039624932
Content-Disposition: form-data; name="uploadFile"; filename="testFile.txt"
Content-Type: text/plain


1 - File content

-----------------------------262541039624932
Content-Disposition: form-data; name="_ns"


-----------------------------262541039624932
Content-Disposition: form-data; name="_qt"

false
-----------------------------262541039624932
Content-Disposition: form-data; name="_body"

{"USER_NAME":""}
-----------------------------262541039624932--

共有1个答案

郎欣然
2023-03-14

我是从RESTful的角度来考虑这个问题的,而不一定是Spring。如果您1)尝试创建或编辑(post或put)一个资源,或者2)尝试上传一个文件;那不应该是两个不同的URI路径吗?

 类似资料:
  • 本文向大家介绍iOS是否可以 在一个视图控制器中嵌入两个tableview控制器?相关面试题,主要包含被问及iOS是否可以 在一个视图控制器中嵌入两个tableview控制器?时的应答技巧和注意事项,需要的朋友参考一下 答案:一个视图控制只提供了一个View视图,理论上一个tableViewController也不能放吧, 只能说可以嵌入一个tableview视图。当然,题目本身也有歧义,如果不是

  • 我在我的控制器类中有一个动作,我想要如下两条不同的路线: 原因是我想给一些用户提供路由访问,但用户角色不同。 假设: 具有角色的用户可以访问 具有< code >用户角色的用户可以访问< code >用户选择日期 问题是是否有可能为一个动作有两个不同的路线?或者我为不同的路线复制了代码?

  • 问题内容: 我想要一个控制器,该控制器映射到两个不同的控制器并在其中映射,如下所示: 可以吗,还是将它分成带有和映射的两个单独的控制器更好的做法? 问题答案: 在这里,将类层次结构绑定到资源层次结构不是主要的设计驱动力。 在Spring MVC中,控制器是简单的POJO,使其易于测试,组合优于继承,注解用于传达含义并使代码更具可读性。 在Controllers下嵌套Controller会破坏这些目

  • 我遇到了一种情况,在处理请求之前,我必须更新它。基本上,我必须用一个可以随时间变化的属性来更新请求。要求消费者随请求一起发送属性是不实际的..所以,我觉得唯一的办法就是..在处理请求之前,更新控制器方法中的请求.. 到目前为止,控制器方法中使用了HttpServletRequest。然后将请求读取为流,然后将其转换为json字符串进行处理。我正在考虑用@RequestBody替换它,并将请求读入p

  • 我试图在我的控制台应用程序中创建流程动画。有没有可能为此需求重写之前的台词?我知道< code>\r但它只对当前行有效。 如果不可能,我怎么能达到动画效果?谢谢。 我的主机是标准的Ubuntu 12.04终端模拟器。 感谢@MrSmith42,我制作了这个简单的演示,它展示了改写行的方法:

  • 我有一个这样的控制器,我想提交一个带有文件上传的表单,以及一些表单数据,如下图所示的标签。此外,我想使用@RequestBody来实现这一点,以便在添加更多变量时,在包装器上使用@Valid注释。 我的包装纸是: 但我想将其从ModelAttributes转换为@RequestBody。 我尝试的方法是将文件上传作为请求参数分开,如下所示: 在模拟MVC中,我设置: 但我得到了这样一个错误,它说: