使用Spring RestTemplate时出现NullPointerException问题求助
嘿,作为Spring初学者遇到这个问题挺常见的,别着急!咱们一步步捋清楚:
首先,你说浏览器访问正常,但客户端调用就炸NPE,核心原因大概率是浏览器和客户端对返回数据的解析逻辑不一样:
浏览器访问时,Spring会把int直接以纯文本(text/plain)的形式返回,浏览器能直接显示数字;但客户端(比如RestTemplate、OkHttp这类工具)默认可能期望接收JSON格式的数据,而纯数字本身并不是有效的JSON(JSON要求是对象、数组或者带引号的字符串),导致客户端的JSON解析器无法正确处理,最终返回null,你后续使用这个null值的时候就触发了NPE。
再结合你的服务器代码,我猜你可能是直接返回int基本类型或者Integer包装类型,比如这两种写法:
// 写法1:直接返回int @GetMapping("/regi") public int getRegId() { return gameSession.getRegId(); } // 写法2:返回Integer @GetMapping("/regi") public Integer getRegId() { return gameSession.getRegId(); }
针对这个问题,给你两个可行的解决方案:
方案1:把返回值包装成JSON对象推荐
客户端喜欢JSON格式的数据,咱们就把int包装成一个标准的JSON对象返回,这样不管是浏览器还是客户端都能完美解析:
方法一:用Map临时包装
@GetMapping("/regi") public Map<String, Integer> getRegId() { Map<String, Integer> result = new HashMap<>(); result.put("regId", gameSession.getRegId()); return result; }
方法二:自定义DTO更规范
如果后续有更多返回字段,建议定义一个专门的响应类:
// 定义响应DTO public class RegIdResponse { private int regId; public RegIdResponse(int regId) { this.regId = regId; } // 必须加getter,否则JSON序列化会有问题 public int getRegId() { return regId; } } // 控制器方法返回DTO @GetMapping("/regi") public RegIdResponse getRegId() { return new RegIdResponse(gameSession.getRegId()); }
这样服务器会返回类似{"regId": 123}的JSON,客户端用对应的类或者Map接收,就不会出现null了。
方案2:让客户端适配纯文本返回
如果不想改服务器代码,也可以调整客户端的请求配置,明确告诉服务器我要纯文本格式的数据:
比如用RestTemplate的话:
// 设置请求头,指定接收text/plain HttpHeaders headers = new HttpHeaders(); headers.setAccept(Collections.singletonList(MediaType.TEXT_PLAIN)); HttpEntity<Void> requestEntity = new HttpEntity<>(headers); // 发送请求,接收字符串然后转成int ResponseEntity<String> response = restTemplate.exchange( "http://your-server-url/regi", HttpMethod.GET, requestEntity, String.class ); int regId = Integer.parseInt(response.getBody());
这样客户端就能正确拿到数字,不会因为解析失败返回null了。
最后提醒一下:出现NPE的时候,最好先定位到客户端代码中具体哪一行抛出的异常,如果是接收到的返回值为null,那基本就是数据格式不匹配的问题啦!
内容的提问来源于stack exchange,提问作者Kevin de Wit

