加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 使用Spring MVC,使用错误的JSON接受POST请求会导致返回

发布时间:2020-12-14 17:43:27 所属栏目:Java 来源:网络整理
导读:我正在使用REST api.收到带有不良 JSON的POST消息(例如{sdfasdfasdf})会导致Spring返回400错误请求错误的默认服务器页面.我不想返回一个页面,我想返回一个自定义的JSON Error对象. 当使用@ExceptionHandler抛出异常时,我可以这样做.所以如果它是一个空白的请
我正在使用REST api.收到带有不良 JSON的POST消息(例如{sdfasdfasdf})会导致Spring返回400错误请求错误的默认服务器页面.我不想返回一个页面,我想返回一个自定义的JSON Error对象.

当使用@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,但是我使用Spring 3.2.0.RELEASE在Jetty 9.0.3.v20130506上运行的本地测试方法来捕获这个异常.

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

我收到一个400状态“错误”字符串响应.

缺陷已在this春季论坛上讨论.

注意:我开始使用Jetty 9.0.0.M4进行测试,但是还有一些其他内部问题阻止了@ExceptionHandler的完成,所以根据您的容器(Jetty,Tomcat,其他)版本,您可能需要获得一个更好的版本,您使用的任何版本的Spring.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读