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 以生成响应实体的主要内容,如果未能解决你的问题,请参考以下文章