JSON 响应给出 Http 500 内部服务器错误
Posted
技术标签:
【中文标题】JSON 响应给出 Http 500 内部服务器错误【英文标题】:JSON response giving Http 500 internal server error 【发布时间】:2015-08-01 16:03:27 【问题描述】:我在尝试进行返回 JSON 的 ajax POST 调用时遇到内部错误。 ajax调用来自JS页面:
$.post(
'FilterAsJson',
$(formWithReportData).serialize(),
function(data)funtion_body
);
这是我的 Spring MVC 调用方法:
@RequestMapping(value = "/Reporting/FilterAsJson", method = RequestMethod.POST)
public @ResponseBody PagedQueryResult<GetEntitlementOverviewReportResult> filterAsJson(@ModelAttribute GetEntitleReportQuery query, HttpSession session)
getEntitlementOverviewFromSession(session).updateFromQuery(query, session);
return queryDispatcher.dispatch(query);
问题出在我在这个类中只设置了几个字段GetEntitlementOverviewReportResult
(30 个中的 17 个)。这是一个带有简单 setter getter 的 bean 类。如果我设置所有 30 个字段,它工作正常。
您能否建议如何设置 JSON 响应,以便我可以纠正此问题。
【问题讨论】:
500 内部服务器错误 一般错误消息,当遇到意外情况且没有更具体的消息适合时给出。如果访问数据库,很可能会出现查询错误。 【参考方案1】:@RequestMapping(value = "/Reporting/FilterAsJson", headers = "Accept=application/json", method = RequestMethod.POST)
public @ResponseBody PagedQueryResult<GetEntitlementOverviewReportResult> filterAsJson(@ModelAttribute GetEntitleReportQuery query, HttpSession session)
getEntitlementOverviewFromSession(session).updateFromQuery(query, session);
return queryDispatcher.dispatch(query);
更新 哦,我明白了。我没有正确理解问题。
请向我们展示传播@ModelAttribute 的GetEntitleReportQuery 类。
还检查当您未填写所有字段时方法序列化的内容。存在吗?
更新
一个主意。
当你没有填写类的所有字段时,他试图找到具有这些字段的类并且找不到。因此,尝试在 Controller 中命名您的类并添加绑定结果参数:filterAsJson(@ModelAttribute("query") GetEntitleReportQuery query, HttpSession session, BindingResult result)
也从名为“query”的 JSP 发送。
【讨论】:
投反对票,因为这不起作用,没有有用的解释,也没有任何贡献。 GetEntitlementOverviewReportResult 类有许多字段,例如。 30.这里有两种情况,第一种情况是在调度到处理程序类时,执行查询,返回所有30个元素,并将它一个一个设置到GetEntitlementOverviewReportResult bean对象类中。在这种情况下,不会遇到内部错误。在第二种情况下,查询获取了 17 行,其余 13 行为空。所以它只为 bean 设置 17 行有值,而跳过其他 13 行,因为它们包含“null”。在这种情况下,我们有一个失败的场景。 @dikkini 我已经对您提到的控制器类中的 filterAsJson 方法进行了更改。你的意思是说在进行 ajax 调用时修改 $post 调用是这样的: $.post('FilterAsJson', $(query).serialize(),function(data)) 。 @dikkini 它也不是那样工作的。我无法弄清楚为什么没有设置的几个字段会导致这么多问题。请提出建议。【参考方案2】:500 错误表示您的服务器在处理请求时遇到错误。由于您使用的是 AJAX,因此您看不到来自服务器的完整消息。
2 个选项:
A - 检查服务器日志
B - 见下文:
我知道通过异步调用检查这一点的最佳方法是按 F12 在 Web 浏览器中调出开发人员工具。
然后,您单击浏览器工具上的“网络”选项卡,您可以看到您的应用程序发出的所有请求。
发出 500 错误的请求,然后在网络请求列表中找到它。您应该会看到 500 错误,并且能够看到实际输出(服务器响应),这将为您提供实际消息。
【讨论】:
我在控制台中找不到任何错误,浏览器只返回“消息:内部服务器错误”。它与执行查询后未设置的字段有什么关系吗?所以json解析失败了?运行正常的查询没有问题。 重新阅读我的帖子。您无需查看控制台。您需要查看调试器上的 network 选项卡,以及给您错误的请求的响应。控制台用于 javascript 错误,您的错误来自服务器上的请求。 响应仅在调试器的网络选项卡中给我 500 错误。我还检查了服务器日志,但没有出现这种情况的日志。在上面的 filterAsJson 方法中,调度程序返回我认为购买的对象,因此它无法以响应形式转换此对象。你能帮我解释一下它失败的原因吗? 看这里getfirebug.com/network,你应该可以看到发出的xmlhttp请求和服务器的响应。 是的,我什么也没得到。它不会返回调用 $post 方法,即未达到回调方法 funtion(data)。响应本身失败。以上是关于JSON 响应给出 Http 500 内部服务器错误的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 ASMX JSON 服务上设置 HTTP 响应代码并引发异常吗?