我正在使用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。
你能告诉我这段代码有什么问题吗?或者我可以忽略此代码中的那种违规行为。
由于
答案 0 :(得分:2)
使用spring @ExceptionHandler注释时,仅表示 指定的异常类型将被设置为方法的参数。 在这种情况下,RemoteException。
请告诉我该代码有什么问题?或者我可以忽略 这段代码中的那种违规行为。
Spring知道被捕获的异常是RemoteException
类型的,但FindBugs并不依赖Spring实现来检测潜在的规则违规。从FindBugs视图中,它只看到一个没有检查的强制转换。这就是为什么它表明可能违反规则的原因。
在您的情况下,您不需要忽略违规,因为Spring允许您根据需要指定异常类型。
<强> org.springframework.web.bind.annotation 强>
注释类型ExceptionHandler
允许使用此注释注释的处理程序方法 拥有非常灵活的签名。他们可能有参数 以下类型,按任意顺序:
异常参数:声明为一般异常或更多 具体例外......
所以,正如@chrylis建议的那样,你应该声明你的方法,以避免演员:
public ResponseEntity<ClientErrorInformation> resourceRemoteExceptionHandler(HttpServletRequest req, RemoteException e)