当前位置: 首页 > 知识库问答 >
问题:

带有异常处理程序的Spring rest Json web服务

雷方伟
2023-03-14

我遇到了一个无条件的问题。我在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;
    }

共有2个答案

方树
2023-03-14

@ExceptionHanlder注释不起作用,因为您的返回类型无效。返回类型可以是String,它被解释为视图名称或ModelAndView对象。

徐栋
2023-03-14

好吧,第一个问题是控制器方法上的@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 ”博客文章。