我收到了一个无条件的问题。我在Spring Json的基础上制作了我的REST服务。我的服务假设使用" Content-Type application / json"但每当我发出没有内容类型的请求时,它就会引发异常。
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'text/plain;charset=UTF-8' not supported
但是我使用@ExceptionHandler处理此异常,但是spring无法处理此异常,并且我的控件没有进入@ExceptionHandler方法。
请指教!我如何确保我的传入请求需要发送内容类型标题??
我想在@ExceptionHandler方法中捕获此异常,以便我可以发送包含错误代码的错误消息。
@RequestMapping(value = "/login", consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON, method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<ReponseWrapper> login(@Valid LoginRequest loginRequest,
BindingResult results,) {
//any code
}
@ExceptionHandler(HttpMediaTypeNotSupportedException.class)
@ResponseStatus(value = HttpStatus.UNSUPPORTED_MEDIA_TYPE)
public @ResponseBody Map<String, Object> handleUnsupportedMediaTypeException(HttpMediaTypeNotSupportedException ex) throws IOException {
Map<String, Object> map = Maps.newHashMap();
map.put("error", "Unsupported Media Type");
map.put("cause", ex.getLocalizedMessage());
map.put("supported", ex.getSupportedMediaTypes());
return map;
}
答案 0 :(得分:0)
嗯,第一个问题是控制器方法上的@ExceptionHandler注释只处理控制器内抛出的异常;您在调用控制器方法之前会遇到异常,因此无法处理。
如果您遇到这样的情况,将会处理:
@Controller
public class TestController {
@ResponseBody
@RequestMapping(value = "/test", consumes = APPLICATION_JSON_VALUE, produces =
APPLICATION_JSON_VALUE)
public ResponseEntity<ResponseWrapper> test(LoginRequest request)
throws HttpMediaTypeNotSupportedException {
throw new HttpMediaTypeNotSupportedException("");
}
@ExceptionHandler(HttpMediaTypeNotSupportedException.class)
@ResponseStatus(value = HttpStatus.UNSUPPORTED_MEDIA_TYPE)
public @ResponseBody Map<String, Object> handleUnsupportedMediaTypeException(
HttpMediaTypeNotSupportedException ex) throws IOException {
Map<String, Object> map = Maps.newHashMap();
map.put("error", "Unsupported Media Type");
map.put("cause", ex.getLocalizedMessage());
map.put("supported", ex.getSupportedMediaTypes());
return map;
}
}
我怀疑你必须扩展只处理HttpMediaTypeNotSupportedException类型的ExceptionHandlerExceptionResolver。或者参考this page,看看它是否有帮助。
另外,看看你是否可以使用更新版本的Spring。
答案 1 :(得分:-1)
@ExceptionHanlder
注释无效,因为您的返回类型无效。返回类型可以是String,它被解释为视图名称或ModelAndView对象。