String Boot 异常 HttpMediaTypeNotAcceptableException 的原因和处理

错误信息摘要

org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
	at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:216)
	at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:376)
	at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:316)
	at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:62)
	at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:350)
	at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1188)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:964)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
......

产生异常的原因

出现这个异常主要是客户端请求期望响应的媒体类型与服务器响应的媒体类型不一致造成的。例如客户端希望返回的媒体类型是json对象(application/json),服务器返回的媒体类型是一个普通的json字符串(text/plain);又或者是客户端希望返回的是html页面,服务器返回的却是json对象。

客户端(或前端)的请求头指定了期望响应的媒体类型是 json 类型

Accept: application/json

服务器端响应的媒体类型是一个 json 字符串,实际上也就是一个普通的字符串

@RequestMapping(value="test",produces="text/plain")
public String test(){
	User user = new User();
	String json = user.toJson();
	return json;
}

解决方法

客户端(前端)的解决

在请求头添加多种媒体类型,用逗号分割

Accept: application/json, text/plain

又或者直接用*号匹配所有类型

Accept: */*
服务端(后端)的解决

方式一:删掉produces属性: @RequestMapping(value=“test”,produces=“text/plain”)
方式二:修改produces为Accept期望的类型@RequestMapping(value=“test”,produces=“application/json”)

改动到了produces有一点需要注意的,这可能会影响到返回值的被别的HttpMessageConverter给处理了,最终会影响到返回内容。那么就要找到对应的HttpMessageConverter添加对应的媒体类型的处理。

  • 19
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Spring Boot提供了多种方式来处理异常,包括全局异常处理、自定义异常和统一异常处理等。 1. 全局异常处理 全局异常处理是指通过`@ControllerAdvice`注解定义一个全局异常处理器,来处理整个应用程序中的异常。全局异常处理器可以处理所有控制器中抛出的异常,包括未被捕获的异常。全局异常处理器通常会返回一个错误页面或JSON数据,提示用户出现了异常。 ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ModelAndView handleException(Exception e) { ModelAndView mav = new ModelAndView("error"); mav.addObject("message", e.getMessage()); return mav; } } ``` 2. 自定义异常 自定义异常是指通过继承`RuntimeException`或其子类来定义自己的异常类。自定义异常通常包含一些业务相关的信息,比如错误码、错误信息等。在抛出异常时,可以使用自定义异常类来传递这些信息。 ```java public class MyException extends RuntimeException { private int code; private String message; public MyException(int code, String message) { this.code = code; this.message = message; } // getter & setter } ``` ```java @GetMapping("/{id}") public User getUser(@PathVariable Long id) { User user = userRepository.findById(id) .orElseThrow(() -> new MyException(404, "User not found")); return user; } ``` 3. 统一异常处理 统一异常处理是指通过继承`ResponseEntityExceptionHandler`类,重写其方法来实现异常处理。统一异常处理可以根据不同的异常类型,返回不同的HTTP状态码和错误信息。 ```java @RestControllerAdvice public class RestExceptionHandler extends ResponseEntityExceptionHandler { @ExceptionHandler(MyException.class) public ResponseEntity<Object> handleMyException(MyException e) { ErrorResponse errorResponse = new ErrorResponse(e.getCode(), e.getMessage()); return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND); } @ExceptionHandler(Exception.class) public ResponseEntity<Object> handleException(Exception e) { ErrorResponse errorResponse = new ErrorResponse(500, "Internal server error"); return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR); } } ``` 总之,Spring Boot提供了多种方式来处理异常,包括全局异常处理、自定义异常和统一异常处理等。开发者可以根据自己的需求选择合适的方式来处理异常

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值