【问题标题】:The parameter is explicitly annotated as being Nullable. Either the use of the parameter or the annotation is wrong该参数被明确注释为 Nullable。要么是参数的使用错误,要么是注解错误
【发布时间】:2018-08-06 14:36:54
【问题描述】:

当下面的代码针对 Sonarqube 中的错误运行时

@Component
public class SMOCreateSignObjectValidator implements Validator{

private static final Logger LOG = LoggerFactory.getLogger(SMOCreateSignObjectValidator.class);
@Override
public boolean supports(Class<?> clazz) {
    LOG.info("Inside create Sign Object validator");
    return AgreementRecordRequest.class.isAssignableFrom(clazz);

}

@Override
public void validate(Object target, Errors errors) {

    AgreementRecordRequest agreementRecordRequest = (AgreementRecordRequest)target;
    if(null==agreementRecordRequest.getCustomerId() || agreementRecordRequest.getCustomerId().replaceAll("\"", "").length()==0 ){
        throw new SystemException(SMOErrorConstants.MESSAGE_SMO_0003_MSG);
    }
    if(agreementRecordRequest.getExpiryDate().isEmpty()){
        throw new SystemException(SMOErrorConstants.MESSAGE_SMO_0004_MSG); 
    }
}

}

在 sonarcube 中抛出以下错误。 sonarqube screenshot

“目标必须为非空但被标记为可空”

我没有明确添加任何注释,为什么会出现这个错误?

【问题讨论】:

  • 是否在AgreementRecordRequest中声明?
  • Validatortarget参数是用Nullable注解的吗?可以想象,sonarqube 将接口的注解应用到实现上,然后通过赋值传递给你的agreementRecordRequest。虽然这使诊断有点神秘,但如果确实发生了这种情况,那么这是一件合适的事情。
  • 验证器中没有可以为空的标记?

标签: java sonarqube custom-validators


【解决方案1】:

您正在通过类转换将目标参数分配给其他参考。因此,您可能会遇到异常。你必须控制它是空还是非空,或者你必须添加 notnull 注释。

【讨论】:

  • 但这似乎并没有解决为什么 sonarqube 声称局部变量 agreementRecordRequest 被显式注释为 Nullable 的主要问题,而 OP 提供的代码中没有这样的注释。
  • 但是 sonarqube 阅读了您的代码并看到它在该分配中可能存在空指针异常。并认为它不应该为空。所以你必须添加非空注释。默认值为空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
相关资源
最近更新 更多