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 内部服务器错误的主要内容,如果未能解决你的问题,请参考以下文章

经典 ASP 给出内部服务器错误 500

我可以在 ASMX JSON 服务上设置 HTTP 响应代码并引发异常吗?

GET 500(内部服务器错误)laravel/js

Web API POST 方法返回 HTTP/1.1 500 内部服务器错误

500错误原因解决方法

post 错误码500是啥