【问题标题】:Can't GET JSONObject from server method(Iternal server error 500)无法从服务器方法获取 JSONObject(内部服务器错误 500)
【发布时间】:2019-01-29 18:02:55
【问题描述】:

我正在开发带有服务器端分页的 java Spring Boot 应用程序,但遇到了问题。当我从 localhost:8080/tabelka 获取所有数据时,一切都很好,但是当我想从 localhost:8080/pgTabelka 获取数据时,postMAN 正在返回:

{
    "timestamp": "2018-08-23T10:58:42.963+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "No message available",
    "path": "/pgTabelka"
}

我的控制器:

package com.example.controller;


import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.dao.SeriaDao;
import com.example.model.Seria;


@RestController
public class WebController {

    @Autowired
    SeriaDao sed;

    HttpServletRequest request;


    @GetMapping("/tabelka")
    public List<Seria> showTable()
    {
        return sed.findAll();
    }

    @GetMapping("/pgTabelka")
    public JSONObject pgTable()
    {
        JSONObject json = new JSONObject();
        int draw = Integer.parseInt(request.getParameter("draw"));
        int start = Integer.parseInt(request.getParameter("start"));
        int length = Integer.parseInt(request.getParameter("length"));
        int totalRecords = sed.recordsTotal();
        List<Seria> serie = sed.findPart(start, length);

        try {
            json.put("draw", ++draw);
            json.put("recordsTotal", totalRecords);
            json.put("recordsFiltered", totalRecords);
            json.put("data", serie);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return json;
    }
}

也许你可以帮我找出错误。我在应用程序中的控制台是 returnint "ERROR 14496 --- [nio-8080-exec-5] oaccC[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] 在上下文中的路径 []抛出异常 [请求处理失败;嵌套异常是 java.lang.NullPointerException] 的根本原因”,但我不确定这与我写的内容有关。谢谢大家的帮助!

编辑: 我更改了这样的代码,控制台中没有错误

int draw = 0;
        int start = 0;
        int length = 10;

        JSONObject json = new JSONObject();
        if(request.getParameter("draw")!=null)
            draw = Integer.parseInt(request.getParameter("draw"));
        if(request.getParameter("start")!=null)
            start = Integer.parseInt(request.getParameter("start"));
        if(request.getParameter("length")!=null)
            length = Integer.parseInt(request.getParameter("length"));

现在 POSTman 回来了

{
    "empty": false
}

编辑2: 我打印了 json 变量,我得到了这个:

{"recordsFiltered":488,"data":[{"feed":"Macroeconomic_And_Major_Markets","unit":"$ per Week","file":"SMU48185800500000011.csv","cassid":"1d2e556b-031e-4c6f-aec4-981c4e907324","name":"Average Weekly Earnings of All Employees: Total Private in Corpus Christi, TX (MSA)","createdate":"2016-10-15T23:38:49","changedate":"2017-01-09T00:50:01","id":41,"datefrom":"2006-12-31","categoryid":3,"frequency":5},{"feed":"Macroeconomic_And_Major_Markets","unit":"Index 2015=100","file":"CP0910CYM086NEST.csv","cassid":"6df5b8d5-ec39-4860-930f-a8b355cce37a","name":"Harmonized Index of Consumer Prices: Audio-Visual, Photographic, and Information Processing Equipment for Cyprus","createdate":"2016-10-15T23:38:49","changedate":"2017-02-16T11:35:04","id":42,"datefrom":"1995-12-31","categoryid":3,"frequency":5},{"feed":"Macroeconomic_And_Major_Markets","unit":"$ per Week","file":"SMU48185800500000011A.csv","cassid":"c3bad2a6-7ad5-4091-846b-f84e9b9f7b50","name":"Average Weekly Earnings of All Employees: Total Private in Corpus Christi, TX (MSA)","createdate":"2016-10-15T23:38:49","changedate":"2017-02-16T11:32:01","id":43,"datefrom":"2006-12-31","categoryid":3,"frequency":8},{"feed":"Macroeconomic_And_Major_Markets","unit":"Index 2015=100","file":"CP0910CZM086NEST.csv","cassid":"84483d95-d914-45ab-a87a-8c063bfc6d0f","name":"Harmonized Index of Consumer Prices: Audio-Visual, Photographic, and Information Processing Equipment for Czech Republic","createdate":"2016-10-15T23:38:49","changedate":"2017-02-16T11:35:04","id":44,"datefrom":"1999-11-30","categoryid":3,"frequency":5},{"feed":"Macroeconomic_And_Major_Markets","unit":"$ per Week","file":"SMU41187000500000011SA.csv","cassid":"285056e3-94ce-4266-98b4-ddf32602c0c2","name":"Average Weekly Earnings of All Employees: Total Private in Corvallis, OR (MSA)","createdate":"2016-10-15T23:38:49","changedate":"2017-01-09T00:50:01","id":45,"datefrom":"2006-12-31","categoryid":3,"frequency":5},{"feed":"Macroeconomic_And_Major_Markets","unit":"Index 2015=100","file":"CP0910DKM086NEST.csv","cassid":"9798eadf-1503-48a5-91e3-cad5852db745","name":"Harmonized Index of Consumer Prices: Audio-Visual, Photographic, and Information Processing Equipment for Denmark","createdate":"2016-10-15T23:38:49","changedate":"2017-02-16T11:35:04","id":46,"datefrom":"1995-12-31","categoryid":3,"frequency":5},{"feed":"Macroeconomic_And_Major_Markets","unit":"$ per Week","file":"SMU41187000500000011.csv","cassid":"d4b22376-2f84-404f-a175-c04ad8ced5a5","name":"Average Weekly Earnings of All Employees: Total Private in Corvallis, OR (MSA)","createdate":"2016-10-15T23:38:49","changedate":"2017-01-09T00:50:01","id":47,"datefrom":"2006-12-31","categoryid":3,"frequency":5},{"feed":"Macroeconomic_And_Major_Markets","unit":"Index 2015=100","file":"CP0910EEM086NEST.csv","cassid":"72880ba0-722e-46bb-98f4-7d388d217c26","name":"Harmonized Index of Consumer Prices: Audio-Visual, Photographic, and Information Processing Equipment for Estonia","createdate":"2016-10-15T23:38:49","changedate":"2017-02-16T11:35:04","id":48,"datefrom":"1995-12-31","categoryid":3,"frequency":5},{"feed":"Macroeconomic_And_Major_Markets","unit":"$ per Week","file":"SMU41187000500000011A.csv","cassid":"03fdf50e-9cd9-483b-aecf-1a0a9e93fa4d","name":"Average Weekly Earnings of All Employees: Total Private in Corvallis, OR (MSA)","createdate":"2016-10-15T23:38:49","changedate":"2017-02-16T11:32:01","id":49,"datefrom":"2006-12-31","categoryid":3,"frequency":8},{"feed":"Macroeconomic_And_Major_Markets","unit":"Index 2005=100","file":"CP0910EZ17M086NEST.csv","cassid":"2943c0f2-ad55-4ec4-98d0-70db25deaefc","name":"Harmonized Index of Consumer Prices: Audio-Visual, Photographic, and Information Processing Equipment for Euro area (17 countries) (DISCONTINUED)","createdate":"2016-10-15T23:38:49","changedate":"2017-02-16T11:35:04","id":50,"datefrom":"1995-12-31","categoryid":3,"frequency":5}],"draw":1,"recordsTotal":488}

所以看起来一切都很好,但是如果我先添加它,为什么在这个 json 对象中不是第一个绘制?为什么 POSTman 越来越“空”?

【问题讨论】:

  • NullPointerException 应该指向一个文件和一个行号。检查该文件和行号。如果你有类似 someObject() 的东西,someObject 为空。如果你有类似 someObject().callOnReturnedObject() 之类的东西,那么 someObject() 可能会返回一个空值。
  • 您能提供更多信息吗?您通过 Postman 发送的请求以及服务日志中的完整堆栈跟踪将非常有帮助。
  • @Michael 是的。 GET localhost:8080/pgTabelka 并得到:{ "timestamp": "2018-08-23T11:47:37.039+0000", "status": 500, "error": "Internal Server Error", "message": "null ", "路径": "/pgTabelka" }
  • @Juan 没有参数,你需要添加那些。至少drawstartlength
  • @Michael 我想从 DataTables 中获取绘图、开始和长度等参数。但可能是我做错了......

标签: java json spring-mvc spring-boot


【解决方案1】:

您已初始化的 HttpServletRequest 存在问题。 它应该作为方法参数传递,而不是在类级别进行初始化。

公共 JSONObject pgTable(HttpServletRequest 请求)

关于响应参数顺序的第二个问题的答案可以通过使用来解决

@ResponseBody USER_DEFINED_CLASS getData()

您可以在 USER_DEFINED_CLASS 中使用

@XmlType(proporder="")

更多参考

  1. @ResponseBody :click here
  2. @XmlType :click here

@XmlType 注释本身就足够了,无需使用上述示例 2 中的任何其他注释

【讨论】:

  • 谢谢,你说得对,但现在对我来说没有任何改变:/
  • 或者我错了。现在我有这样的东西:“ERROR 18272 --- [nio-8080-exec-2] oaccC[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] 与路径 [ ] 抛出异常 [请求处理失败;嵌套异常是 java.lang.NumberFormatException: null] 根本原因"
  • 对 request.getParameter("parameterName") 做空检查 if(request.getParameter("parameterName")!=null){ parseToINT...... }
  • 我做到了,现在 POSTMan 正在返回 "{ "empty": false }"
  • 返回"{"empty": false }"虽然名为json的变量不为空,不为null,有数据。
【解决方案2】:

请确保在解析成Integer参数之前不能为null

    @RequestMapping(value="/pgTabelka", method = {RequestMethod.GET})
    @ResponseBody
    public JSONObject pgTable(HttpServletRequest request)
        {
           //validate request parameter before converting it into Integer
    }

【讨论】:

  • 感谢您的回答。我已经编辑了我的帖子,字段看起来不为空......
  • @PawełMałysz 你检查你的返回 JSON 对象是否正确创建?(在返回之前使其 sysout)
  • 添加@ResponseBody 并检查
  • 我像这样添加它:@ResponseBody @GetMapping("/pgTabelka") public JSONObject pgTable(HttpServletRequest request) {" 还是一样,没有任何改变
【解决方案3】:

首先,在获取如下参数之前,您应该拥有请求对象。

@GetMapping("/pgTabelka")
    public JSONObject pgTable(HttpServletRequest request)
    {

}

JSONObject json = new JSONObject();这一行下下断点,逐行调试。

发生这种情况是因为参数 draw、start、length 之一为空。

一旦你解决了 NullPointerException ,你也可能得到 NumberFormatException ,以防止在转换为整数之前检查值是否可以转换为整数。

【讨论】:

  • 是的,你是对的,参数可能为空。但我不明白我应该如何解决它......
  • 确保您的请求正文 JSON 包含所有 3 个字段和一些值。
  • 请看 EDIT。看起来这 3 个字段不是 null,而是“空”?
【解决方案4】:

我假设您的请求中未提供其中一个参数。例如。线

Integer.parseInt(request.getParameter("draw"))

如果请求没有参数draw,则抛出NullPointerException

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2017-04-12
    相关资源
    最近更新 更多