Spring MVC Restful 406不可接受错误
我知道以前有人问过这个问题,我用406错误消息检查了SpringMVC的每条消息,我不知道如何解决这个问题,因为我已经尝试了前面答案中第四位的所有内容 这一web服务获取一个电子邮件地址,并返回一个JSON格式的用户对象。我可以告诉你单元测试非常有效。我知道我们通过了Spring安全性,我们正在执行servlet。。。现在唯一的问题是JSON输出。。。我不明白,我收到了这个错误信息 因此,准确地说:Spring MVC Restful 406不可接受错误,spring,rest,spring-mvc,curl,Spring,Rest,Spring Mvc,Curl,我知道以前有人问过这个问题,我用406错误消息检查了SpringMVC的每条消息,我不知道如何解决这个问题,因为我已经尝试了前面答案中第四位的所有内容 这一web服务获取一个电子邮件地址,并返回一个JSON格式的用户对象。我可以告诉你单元测试非常有效。我知道我们通过了Spring安全性,我们正在执行servlet。。。现在唯一的问题是JSON输出。。。我不明白,我收到了这个错误信息 因此,准确地说: 弹簧芯:4.2.4.1释放 Spring Security:4.0.3.0版本 XML:2.6.
弹簧芯:4.2.4.1释放 Spring Security:4.0.3.0版本 XML:2.6.5(核心、数据绑定、注释) 2.7.0似乎还不起作用 以下是springmvc-servlet.xml:
<context:annotation-config />
<context:component-scan base-package="com.agmednet.server.controller" />
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.agmednet.server.HibernateAwareObjectMapper">
<property name="dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss.SSS"></constructor-arg>
</bean>
</property>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
如您所见,我有Accept头设置,我有@ResponseBody
注释
除此之外,我还有一个SimpleCORSFilter
代码:
@Component
public class SimpleCORSFilter implements Filter
{
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException
{
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with, Content-Type, Accept, If-Modified-Since, openam_token");
chain.doFilter(req, res);
}
public void init(FilterConfig filterConfig){}
public void destroy(){}
}
如您所见,它接受我的“openam_令牌”的自定义头,但它有
“接受”和“内容类型”
我在防火墙后面的linux设备上调用它,所以我必须用SSH连接到机器上,并执行以下curl语句:
curl -v -i -X GET -H "openam_token: AQIC5wM2LY4Sfcxfw-GSBSndg-4DMEyrEqcBgiTE4b4e3aE.*AAJTSQACMDE.*" -H "Content-Type: application/json, text/html" -H "Accept: application/json, text/html" backend.spring.mycompany.net:8080/services/api/users/email/user4252002@mycompany.com
下面是我在请求中通过curl发送的内容:
* Trying 10.0.4.107...
* Connected to backend.spring.agmednet.net (10.0.4.107) port 8080 (#0)
> GET /services/api/users/email/user4252002@agmednet.com HTTP/1.1
> User-Agent: curl/7.40.0
> Host: backend.spring.agmednet.net:8080
> openam_token: AQIC5wM2LY4Sfcxfw-GSBSndg-4DMEyrEqcBgiTE4b4e3aE.*AAJTSQACMDE.*
> Content-Type: application/json, text/html
> Accept: application/json, text/html
以下是回应:
< HTTP/1.1 406 Not Acceptable
HTTP/1.1 406 Not Acceptable
< Server: Apache-Coyote/1.1
Server: Apache-Coyote/1.1
< Access-Control-Allow-Origin: *
Access-Control-Allow-Origin: *
< Access-Control-Allow-Methods: POST, PUT, GET, OPTIONS, DELETE
Access-Control-Allow-Methods: POST, PUT, GET, OPTIONS, DELETE
< Access-Control-Max-Age: 3600
Access-Control-Max-Age: 3600
< Access-Control-Allow-Headers: x-requested-with, Content-Type, Accept, If-Modified-Since, openam_token
Access-Control-Allow-Headers: x-requested-with, Content-Type, Accept, If-Modified-Since, openam_token
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
Pragma: no-cache
< Expires: 0
Expires: 0
< X-XSS-Protection: 1; mode=block
X-XSS-Protection: 1; mode=block
< X-Frame-Options: DENY
X-Frame-Options: DENY
< X-Content-Type-Options: nosniff
X-Content-Type-Options: nosniff
< Set-Cookie: JSESSIONID=76C4B28DD0B5D88EB9341944BDBCD045; Path=/services/; HttpOnly
Set-Cookie: JSESSIONID=76C4B28DD0B5D88EB9341944BDBCD045; Path=/services/; HttpOnly
< Content-Type: text/html;charset=utf-8
Content-Type: text/html;charset=utf-8
< Content-Language: en
Content-Language: en
< Content-Length: 1110
Content-Length: 1110
< Date: Wed, 20 Jan 2016 14:30:28 GMT
Date: Wed, 20 Jan 2016 14:30:28 GMT
<!DOCTYPE html>
<html><head>
<title>Apache Tomcat/8.0.30 - Error report</title>
</head>
<body>
<h1>HTTP Status 406 - </h1>
<div class="line"></div><p><b>type</b> Status report</p>
<p><b>message</b> <u></u></p>
<p><b>description</b>
<u>The resource identified by this request is only capable of generating
responses with characteristics not acceptable according to the request*
Connection #0 to host backend.spring.agmednet.net left intact
"accept" headers.</u></p>
<hr class="line"><h3>Apache Tomcat/8.0.30</h3></body></html>
“接受”标题
因此,我使用的是@ResponseBody
,我使用的是最新的Jackson 2.x版本。我正在遵循前面问题中的所有建议,但我仍然无法实现这一点
任何帮助都将不胜感激。问题不在于@EnableWebMVC,您在问题中看到的一切都是100%正确的。我还有另外两个工作正常的web服务。问题最终在于curl语句本身:
curl -v -i -X GET -H /
"openam_token: AQIC5wM2LY4Sfcxfw-GSBSndg-4DMEyrEqcBgiTE4b4e3aE.*AAJTSQACMDE.*" /
-H "Content-Type: application/json, text/html" /
-H "Accept: application/json, text/html" /
backend.spring.mycompany.net:8080/services/api/users/email/user4252002@mycompany.com
如果您注意到,URL和path变量不在引号中。
如果您注意到,电子邮件地址中有一个@符号,我发现它意味着一些东西。所以,我所做的就是把我的卷曲度改成如下
curl -v -i -X GET -H /
"openam_token: AQIC5wM2LY4Sfcxfw-GSBSndg-4DMEyrEqcBgiTE4b4e3aE.*AAJTSQACMDE.*" /
-H "Content-Type: */*" /
-H "Accept: */*" /
"backend.spring.mycompany.net:8080/services/api/users/email/user4252002%40mycompany%2Ecom"
1) 我自己将电子邮件地址@编码为%40,句点编码为%2E
您可以使用任何工具对path变量进行编码
2) 即使我返回一个转换成JSON的java对象,我还是将标题“Accept”和“Content Type”更改为“/”
就这样。这起作用,406错误消息消失。对于初学者,请删除
@EnableWebMvc
您已经有了
,这与前面所述的相同。删除EnableWebMvc,以及您为什么希望接收作为路径变量的清晰电子邮件地址。。接收一个简单的字符串并检查它是否是有效的电子邮件。其次,您不需要显式地添加products和accepts。。。。web服务未检查电子邮件的有效性。这是基于我们的需求,我们发送电子邮件,我们在该字段上进行数据库查找,并从中返回一个用户,这是一个业务需求!!!!其次,我理解a我不需要“生产”,但有“接受”并没有坏处,但我会删除它,看看它是否能解决我的问题。我添加它们的唯一原因是为了测试,看看这是否解决了问题,但没有。如前所述,我已经从控制器中删除了@EnableWebMvc。因此,我现在正在进行测试。从控制器中删除了Products和accept,并删除了@EnabledWebMvc注释。。。但仍然没有成功。为什么我不感到惊讶?!?!?!
curl -v -i -X GET -H /
"openam_token: AQIC5wM2LY4Sfcxfw-GSBSndg-4DMEyrEqcBgiTE4b4e3aE.*AAJTSQACMDE.*" /
-H "Content-Type: application/json, text/html" /
-H "Accept: application/json, text/html" /
backend.spring.mycompany.net:8080/services/api/users/email/user4252002@mycompany.com
curl -v -i -X GET -H /
"openam_token: AQIC5wM2LY4Sfcxfw-GSBSndg-4DMEyrEqcBgiTE4b4e3aE.*AAJTSQACMDE.*" /
-H "Content-Type: */*" /
-H "Accept: */*" /
"backend.spring.mycompany.net:8080/services/api/users/email/user4252002%40mycompany%2Ecom"