【问题标题】:@ModelAttribute method handles @RequestBody object throws HttpMessageNotReadableException@ModelAttribute 方法处理 @RequestBody 对象抛出 HttpMessageNotReadableException
【发布时间】:2018-03-20 04:48:49
【问题描述】:

在@ControllerAdvice 类中,我只想获取请求正文。我不知道比在 @ModelAttribute 方法中处理它并将 @RequestBody 值设置为道具更好。所以,这里的问题是当我打开@RequestBody 时它仍然按预期获得请求正文,但之后它会抛出 HttpMessageNotReadableException。 有人可以告诉我原因并有解决问题的想法。这对我来说真的很重要。

@ControllerAdvice 
public class CustomRestExceptionHandler extends ResponseEntityExceptionHandler 
{


    public CustomRestExceptionHandler() {
        super();
    }

    private Object request;

    @ModelAttribute
    public void setRequest(@RequestBody Object request) {
        this.request = request;
    }

    @Override protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        logger.info(this.request)
    }

    @Override
    protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        return new ResponseEntity<Object>(ex, HttpStatus.BAD_REQUEST);
    }

}

【问题讨论】:

  • 你是怎么解决这个问题的?我遇到了同样的问题:(
  • 我很抱歉。真的是很久以前的事了。可能是因为我解决不了这个问题,所以没有拿到请求值了。 github.com/zcmgyu/it-blog-backend/blob/…

标签: java spring-boot exception-handling modelattribute


【解决方案1】:

我相信您收到 HttpMessageNotReadableException 的原因是您尝试使用 @RequestBody 注释两次将 JSON 映射到一个对象。首先在 ControllerAdvice 模型属性中,然后在控制器方法参数中。假设你有一个看起来像这样的控制器

@RestController
public class MyController{

@PostMapping("endpoint")
public Response processRequest(@RequestBody MyObject myRequest)
System.out.println("bla bla");
}

尝试删除 @RequestBody 注释并将其更改为

@PostMapping("endpoint")
public Response processRequest(final MyObject myRequest)
System.out.println("bla bla");
}

然后将 Controller Advice 修改为如下所示:

@ControllerAdvice 
public class CustomRestExceptionHandler extends ResponseEntityExceptionHandler 
{


    public CustomRestExceptionHandler() {
        super();
    }

    private MyObject request;



@ModelAttribute("myRequest") //same as in controller
    public MyObject setRequest(@RequestBody MyObject request) {
        this.request = request;
        return request;
    }

    @Override protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        logger.info(this.request)
    }

    @Override
    protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        return new ResponseEntity<Object>(ex, HttpStatus.BAD_REQUEST);
    }

}

您的 ModelAttribute 现在返回转换后的对象,以便将其传递给控制器​​。希望它能解决你的问题。

【讨论】:

  • 感谢您的回答。因为是很久以前的事了,所以无法再验证这个bug。如果你的答案可以在这里任何人,我会标记你的答案。再次感谢。
猜你喜欢
  • 2021-11-01
  • 2019-02-21
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多