Sonar违规使用Spring ExceptionHandler

时间:2016-10-23 09:05:41

标签: java spring error-handling findbugs

我正在使用SpringFramework 4.3.2和SonarQube v5.6.1与FindBugs并获得以下违规行为:

  

从Exception到java.rmi.RemoteException

的未经检查/未确认的强制转换

这是原始代码:

    @ExceptionHandler(RemoteException.class)
     public ResponseEntity<ClientErrorInformation> resourceRemoteExceptionHandler(HttpServletRequest req, Exception e){
      RemoteException re = (RemoteException) e;

      ...

      return new ResponseEntity<ClientErrorInformation>(new ClientErrorInformation(null, "Internal server error", req.getRequestURI(), false,null), HttpStatus.INTERNAL_SERVER_ERROR);          
    }
}

使用spring @ExceptionHandler注释时,意味着只将指定类型的异常设置为方法的参数。 在这种情况下,RemoteException。

你能告诉我这段代码有什么问题吗?或者我可以忽略此代码中的那种违规行为。

由于

1 个答案:

答案 0 :(得分:2)

  

使用spring @ExceptionHandler注释时,仅表示   指定的异常类型将被设置为方法的参数。   在这种情况下,RemoteException。

     

请告诉我该代码有什么问题?或者我可以忽略   这段代码中的那种违规行为。

Spring知道被捕获的异常是RemoteException类型的,但FindBugs并不依赖Spring实现来检测潜在的规则违规。从FindBugs视图中,它只看到一个没有检查的强制转换。这就是为什么它表明可能违反规则的原因。 在您的情况下,您不需要忽略违规,因为Spring允许您根据需要指定异常类型。

来自http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/ExceptionHandler.html

<强> org.springframework.web.bind.annotation

注释类型ExceptionHandler

  

允许使用此注释注释的处理程序方法   拥有非常灵活的签名。他们可能有参数   以下类型,按任意顺序:

     

异常参数:声明为一般异常或更多   具体例外......

所以,正如@chrylis建议的那样,你应该声明你的方法,以避免演员:

public ResponseEntity<ClientErrorInformation> resourceRemoteExceptionHandler(HttpServletRequest req, RemoteException e)