Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何处理SpringRESTAPI上的内部服务器错误(500)?_Java_Spring_Rest_Spring Mvc - Fatal编程技术网

Java 如何处理SpringRESTAPI上的内部服务器错误(500)?

Java 如何处理SpringRESTAPI上的内部服务器错误(500)?,java,spring,rest,spring-mvc,Java,Spring,Rest,Spring Mvc,你好 我正在开发SpringRESTAPI,我想确保一切正常。我想记录异常行为,如nullPointerException或数据库连接错误,或任何可能引发、未处理或未假设的异常 我希望捕获任何未处理的异常,并向用户显示一条漂亮的消息,而不是打印堆栈跟踪 为此,我在internet上找到了一个解决方案,即扩展ResponseEntityExceptionHandler并重写handleExceptionInternal方法 我还喜欢记录404错误,以查看是否有人试图攻击我的服务器 我还在属性文件中

你好

我正在开发SpringRESTAPI,我想确保一切正常。我想记录异常行为,如nullPointerException或数据库连接错误,或任何可能引发、未处理或未假设的异常

我希望捕获任何未处理的异常,并向用户显示一条漂亮的消息,而不是打印堆栈跟踪

为此,我在internet上找到了一个解决方案,即扩展ResponseEntityExceptionHandler并重写handleExceptionInternal方法

我还喜欢记录404错误,以查看是否有人试图攻击我的服务器

我还在属性文件中添加了这一行:spring.mvc.throw exception if no handler found=true

这是handleExceptionInternal的代码

@Override
protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {

    GenericResponse response = new GenericResponse();
    response.setMessage("Internal error occured, " + ex.getStackTrace()[0]);

    System.out.println("big exceptions");

    return new ResponseEntity(response, headers, status);

}
@覆盖
受保护的ResponseEntity handleExceptionInternal(异常ex、对象体、HttpHeaders、HttpStatus状态、WebRequest请求){
GenericResponse response=新的GenericResponse();
response.setMessage(“发生内部错误,”+ex.getStackTrace()[0]);
System.out.println(“重大例外”);
返回新的ResponseEntity(响应、标题、状态);
}
我的问题是,当我传递不正确的路由(如/abc)时,此代码运行良好,但当我从controllers方法抛出null指针异常时,此方法无法捕获它

谢谢。

@ControllerAdvice
@ControllerAdvice
public class Handler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<Object> handle(Exception ex, 
                HttpServletRequest request, HttpServletResponse response) {
        if (ex instanceof NullPointerException) {
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
    }
}
公共类处理程序{ @ExceptionHandler(Exception.class) 公共响应性句柄(例外,例如, HttpServletRequest请求,HttpServletResponse响应){ if(NullPointerException的实例除外){ 返回新的响应属性(HttpStatus.BAD_请求); } 返回ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } }
文档化-在这里您可以找到方法签名可以使用的所有对象

ControllerAdvice
-没有附加属性,它将处理所有异常,因此它可以提供意外行为。最好为
basePackages
属性提供一个包(您的包),它将只处理指定包中抛出的异常


另外,将异常分离到自定义
@ExceptionHandler
标记的方法也是一种很好的做法,它将解耦处理程序逻辑。

Spring默认情况下不处理
NullPointerException
。如果选中
ResponseEntityExceptionHandler
,您将看到一个包含已处理异常的列表。您可以扩展implement
HandlerExceptionResolver
并实现自定义逻辑(不要忘记将您的方法映射到
@ExceptionHandler(NullPointerException.class)
。例如,有一个自定义的处理程序,run-through。我不在乎它是否为null异常,我只是喜欢处理所有类型的异常,比如异常类。正如您可以看到的spring实现,只需使用
@ExceptionHandler(RuntimeException.class)标记您的方法即可
-这种方法非常通用,它会迫使您执行异常的
实例。请您出示一些代码片段。如果这样做有效,我将接受这个答案,我真的被困在这里了。ControllerAdvice是通往Go的方法。您能帮我做一件事吗?我在完成后还使用了public void(HttpServletRequest请求、HttpServletResponse响应、对象处理程序、异常ex)引发Nullpointer异常时,ex仍然为null。因为请求处理的筛选器阶段不涉及Spring异常处理。我在实践中看到的唯一可能的方法(有点棘手)是使用