我遇到了一个无条件的问题。我在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;
}
@ExceptionHanlder
注释不起作用,因为您的返回类型无效。返回类型可以是String,它被解释为视图名称或ModelAndView对象。
好吧,第一个问题是控制器方法上的@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;
}
}
我怀疑您必须扩展exceptionhandleexceptionresolver,以便只处理HttpMediaTypeNotSupportedException类型。或者参考这个页面,看看有没有帮助。
另外,看看你是否能使用新版本的Spring。
1.1 异常处理的基本使用 try: <语句块1> except: <语句块2> try 捕获异常 except 发生异常时执行 try: <语句块1> except <异常类型名字>: <语句块2> except <异常类型名字> 发生对应异常时才会执行 1.2 异常处理的高级使用 try: <语句块1> except
问题内容: 对于我在ANTLR中的语法,我的Java代码可以捕获并打印包含“ $”的输入的错误。在我的实现中,我需要打印出“成功”以便成功输入。因此,我在Java代码中进行了跟踪, 对于我的情况,对于错误的输入,getNumberofSyntaxErrors返回大于0的数字。对于“ int i;”,输出为公正; 当我为int $ i;之类的输入运行代码时,由于getNumberofSyntaxEr
问题内容: 如果我在.NET中没有记错的话,可以为未处理的异常注册“全局”处理程序。我想知道Java是否有类似的东西。 问题答案: 是的,有,但只有在没有设置时才会触发。
有没有一种方法可以在Spring Boot异常处理程序中一次捕获从web请求抛出的所有异常?我知道我可以在用注释的方法中捕获异常类型数组,但它不是我所说的类型。我需要一个异常对象列表之类的东西。我已经试过了 但Spring无法找到合适的解析器: 它只捕捉一个可抛物体,工作很好: 但是,如果在同一请求中有不同的参数冲突,如和,该怎么办? 如果不可能处理异常列表,如何满足RFC-7807(参见http
我试图执行一些适用于代码中所有的通用逻辑。我知道我可以编写一个来拦截快乐路径。但是,我想连接到异常处理生命周期中,以便在呈现错误响应之前执行一些常见的逻辑,比如日志记录。 在Spring Boot/Spring MVC中有这样做的方法吗?如果可能的话,我希望避免为此编写servlet过滤器。
问题内容: 有没有一种方法可以在Java中创建全局异常处理程序。我想这样使用: 处理程序可能无法捕获在主体中引发的异常。 马丁 问题答案: 使用Thread.setDefaultUncaughtExceptionHandler。有关示例,请参见Rod Hilton的“ Global Exception Handling ”博客文章。