spring 控制器返回 404 并带有 post 和 file 以生成响应实体

Posted

技术标签:

【中文标题】spring 控制器返回 404 并带有 post 和 file 以生成响应实体【英文标题】:spring controller returns 404 with post and file with get to generate responseentity 【发布时间】:2017-04-06 00:25:45 【问题描述】:

我有一个使用 @RestController 注释的控制器,并且映射返回 ResponseEntity 和 spring 4.3

该方法接收带有数据的表单以生成文件,但是如果我使用 GET 方法 url 请求文件它会生成文件,但是如果我使用 POST 方法 url 请求文件,spring 返回 404

@RequestMapping("/request")
@RestController 
MyController 

    @RequestMapping("/notes.do")
    ResponseEntity<byte[]> notes(HttpServletRequest request, HttpServletResponse response, Principal principal, NotesForm form) 
        return createResponseEntity(form);
    

我从 weblogic 的 access.log 中得到这个

127.0.0.1 - - [05/abr/2017:19:11:06 -0500] "GET /app-web/request/notes.do?noteType=DATA&noteContent=HELLO HTTP/1.1" 201 35602
127.0.0.1 - - [05/abr/2017:19:12:29 -0500] "POST /app-web/request/notes.do HTTP/1.1" 404 1322

这是获取请求的请求标头

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,es;q=0.6
Cache-Control:no-cache
Connection:keep-alive
Cookie:theme=siirfe-pink;     SIIRFESESS=XKdAssgx6p_kr8OFTRqYQa7IKG8nrIXZr5lO1Ns8lpWE1pFSqfwf!-2083194325!NONE
Host:wlcap1:9102
Pragma:no-cache
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.

以及post请求的请求头

Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8,es;q=0.6
Cache-Control:no-cache
Connection:keep-alive
Content-Length:103
content-type:application/x-www-form-urlencoded;charset=UTF-8
Cookie:theme=siirfe-pink; SIIRFESESS=XKdAssgx6p_kr8OFTRqYQa7IKG8nrIXZr5lO1Ns8lpWE1pFSqfwf!-2083194325!NONE
Host:wlcap1:9102
Origin:http://wlcap1:9102
Pragma:no-cache
Referer:http://wlcap1:9102/app-web/dictaminacion
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36

这是获取请求的响应:

Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Content-Disposition:form-data; name="attachment"; filename="ARCHIVO.DOCX"
Content-Length:35602
Content-Type:application/docx
Date:Thu, 06 Apr 2017 00:39:04 GMT
Expires:0
Pragma:no-cache
X-Content-Type-Options:nosniff
X-Frame-Options:DENY
X-ORACLE-DMS-ECID:8ac7d542-7157-4b0a-8190-f8e69f03a454-00001af0
X-ORACLE-DMS-RID:0
X-XSS-Protection:1; mode=block

post 请求的响应只是一个错误页面。

有什么方法可以让我从发布请求中获取文件还是我遗漏了什么?

根据日志,在这两种情况下一切似乎都很好(控制器运行直到两种情况下的请求返回)

发布请求时响应实体上的内容:

201 Created,[B@1e6804c8,Content-Type=[application/docx], Content-Disposition=[form-data; name="attachment"; filename="ARCHIVO.DOCX"]

获取请求时响应实体上的内容:

201 Created,[B@39cb5a1a,Content-Type=[application/docx], Content-Disposition=[form-data; name="attachment"; filename="ARCHIVO.DOCX"]

我没有发现任何错误信息。

【问题讨论】:

请完整显示/...。另请注意,通常不鼓励使用 HttpServletRequest/Response,因为 Spring 为您想要的几乎所有内容提供了神奇的类型安全绑定。 是的。在 Spring 构建 RESTful Web 服务的方法中,HTTP 请求由 @RestController 注释标识的控制器处理。使用@RequestParam@PathVariable获取参数。 在 404 回电的 URL 中多了一个/,这是您的问题中的拼写错误,还是答案? 这是一个错字 @RequestMapping("/requests")/app-web/request/.. 的区别是不是也是笔误?请修复这些,这会让一切变得更加混乱。使用相同的代码,它在我的本地工作,无法找出原因。 【参考方案1】:

更改发布请求上的 Accept 标头解决了该问题。 我不确定为什么这是一个问题,因为它列出了 */ * (忽略空格,不知道如何让评论正确显示)作为最后一个选项,但是删除了 application/json 和 text/plain 解决了问题

【讨论】:

以上是关于spring 控制器返回 404 并带有 post 和 file 以生成响应实体的主要内容,如果未能解决你的问题,请参考以下文章

带有 Maven Shade 插件的 Spring Boot - 未映射控制器(404 错误)

Spring Boot POST 请求返回 http 状态 405“方法不允许”而不是 HTTP 状态 404

Spotify Web API 返回 404 并带有有效的节目 ID

获取 JWT 后,带有 Spring Boot 后端的 Angular 在现有路由上返回 404

表单提交后 POST 方法返回 404 - Laravel

Junit MockMvc 使用 URL 中的路径变量执行 POST,返回 404 未找到