gpt4 book ai didi

java - 使用 Spring MVC,接受带有错误 JSON 的 POST 请求会导致返回默认的 400 错误代码服务器页面

转载 作者:搜寻专家 更新时间:2023-10-30 21:06:24 25 4
gpt4 key购买 nike

我正在开发 REST api。接收到带有错误 JSON 的 POST 消息(例如 { sdfasdfasdf } )会导致 Spring 返回默认服务器页面以获得 400 Bad Request Error。我不想返回一个页面,我想返回一个自定义的 JSON 错误对象。

当使用@ExceptionHandler 抛出异常时,我可以这样做。因此,如果它是一个空白请求或一个空白 JSON 对象(例如 { } ),它将抛出一个 NullPointerException,我可以用我的 ExceptionHandler 捕获它并做任何我想做的事。

那么问题是,当 Spring 只是无效语法时,它实际上并没有抛出异常……至少我看不到。它只是从服务器返回默认错误页面,无论是 Tomcat、Glassfish 等。

所以我的问题是如何“拦截”Spring 并使其使用我的异常处理程序或以其他方式阻止显示错误页面并返回一个 JSON 错误对象?

这是我的代码:

@RequestMapping(value = "/trackingNumbers", method = RequestMethod.POST, consumes = "application/json")
@ResponseBody
public ResponseEntity<String> setTrackingNumber(@RequestBody TrackingNumber trackingNumber) {

HttpStatus status = null;
ResponseStatus responseStatus = null;
String result = null;
ObjectMapper mapper = new ObjectMapper();

trackingNumbersService.setTrackingNumber(trackingNumber);
status = HttpStatus.CREATED;
result = trackingNumber.getCompany();


ResponseEntity<String> response = new ResponseEntity<String>(result, status);

return response;
}

@ExceptionHandler({NullPointerException.class, EOFException.class})
@ResponseBody
public ResponseEntity<String> resolveException()
{
HttpStatus status = null;
ResponseStatus responseStatus = null;
String result = null;
ObjectMapper mapper = new ObjectMapper();

responseStatus = new ResponseStatus("400", "That is not a valid form for a TrackingNumber object " +
"({\"company\":\"EXAMPLE\",\"pro_bill_id\":\"EXAMPLE123\",\"tracking_num\":\"EXAMPLE123\"})");
status = HttpStatus.BAD_REQUEST;

try {
result = mapper.writeValueAsString(responseStatus);
} catch (IOException e1) {
e1.printStackTrace();
}

ResponseEntity<String> response = new ResponseEntity<String>(result, status);

return response;
}

最佳答案

这是作为 Spring 的问题提出的 SPR-7439 - JSON (jackson) @RequestBody 编码抛出笨拙的异常 - 在 Spring 3.1M2 中通过让 Spring 在消息正文丢失或无效的情况下抛出 org.springframework.http.converter.HttpMessageNotReadableException 来修复.

在您的代码中,您无法创建 ResponseStatus,因为它是抽象的,但我测试了在 Jetty 9.0.3.v20130506 上运行的 Spring 3.2.0.RELEASE 本地使用更简单的方法捕获此异常。

@ExceptionHandler({org.springframework.http.converter.HttpMessageNotReadableException.class})
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public String resolveException() {
return "error";
}

我收到了 400 状态“错误”字符串响应。

该缺陷已在 this 上讨论过 Spring 论坛帖子。

注意:我开始使用 Jetty 9.0.0.M4 进行测试,但有一些其他内部问题阻止 @ExceptionHandler 完成,因此取决于您的容器(Jetty, Tomcat,其他)版本,您可能需要获得一个更新的版本,该版本可以很好地与您使用的任何版本的 Spring 配合使用。

关于java - 使用 Spring MVC,接受带有错误 JSON 的 POST 请求会导致返回默认的 400 错误代码服务器页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17201072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com