【问题标题】:Rest Api exception handlingRest Api 异常处理
【发布时间】:2017-12-22 20:12:49
【问题描述】:

我有不同的服务和网络项目。我想知道当特定异常来自服务时如何处理。例如,我在服务端处理 DuplicateDataException 如下:

public void serviceFunction()
{
try
{
//code
}catch(DuplicateDataException e)
{
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
                    .entity(e.getMessage()).build();
}}

UI端:控制器类通过Rest API调用服务函数

@RequestMapping(value = "/addNew", method = RequestMethod.POST)
    public ModelAndView addNew(Object obj) { 

try {
            restTemplate.exchange(url, HttpMethod.POST, httpEntity,
                    Object.class);
             LOGGER.info("Object Created Successfully");
        } catch (Exception e) { 
return ModelAndView("PageName", "param","value");
}
}

在 UI 端,我收到内部服务器错误,相反,我想获得在服务端设置的实体错误消息值。

【问题讨论】:

  • 您为什么要发送 5xx 类消息,因为它更可能是 4xx 类错误?
  • 我也尝试过 BAD_REQUEST 但它会进入相同的 catch 块,用于 return ModelAndView("PageName", "param","value");我需要“价值”作为服务端返回响应实体中设置的消息。

标签: java rest spring-mvc


【解决方案1】:

作为一种最佳实践,尝试在服务代码中捕获异常并抛出 RuntimeException("An error occured") 或扩展 Java 的 RuntimeException 的自定义异常。然后,您可以为所有控制器定义一个全局 ExceptionHandler 并返回您自己的错误页面,例如:

@ControllerAdvice
public class MyExceptionHandler {

  @ResponseStatus(HttpStatus.NOT_FOUND)
  @ExceptionHandler(Exeption.class)
  public ModelAndView handleFileNotFoundException(Exception exception){

    ModelAndView modelAndView = new ModelAndView();

    modelAndView.setViewName("yourView");
    modelAndView.addObject("exception", exception);

    return modelAndView;
 }

}

【讨论】:

    猜你喜欢
    • 2013-07-02
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 2021-12-18
    • 2018-01-16
    • 2014-02-21
    相关资源
    最近更新 更多