Как установить фильтр FindBugs для полей с определенной аннотацией?

У меня есть ошибка, о которой сообщает FindBugs, но я знаю лучше:) см. следующий пример:

public class MyClass extends BaseClass {

    @CustomInjection
    private Object someField;

    public MyClass() {
        super();
        someField.someMethod(); // Bug is here because FindsBugs thinks this is always null
    }
}

В моем конструкторе BaseClass я добавляю все поля с аннотацией @CustomInjection с правильным объектом, поэтому мои аннотированные поля в моем случае не равны нулю.

Я не хочу подавлять предупреждение с помощью "suppresswarnings", потому что это значительно загромождает код. Я предпочитаю, чтобы фильтр, подобный findbugs, объяснял здесь, но я не могу понять, как фильтровать ошибки для полей, аннотированных определенным интерфейсом. Я также не хочу фильтровать все предупреждения об ошибках в null. Я думаю, что это должно быть что-то вроде:

<Match>
  <Bug code="UR">  
  <Field annotation="CustomInjection">
</Match>

Ответ 1

Я нашел обходное решение для решения этой проблемы. Кажется, что обнаружение для инъекций, основанных на аннотациях, жестко закодировано в FindBugs, см. Этот фрагмент исходного кода:

public static boolean isInjectionAttribute(@DottedClassName String annotationClass) {
    if (annotationClass.startsWith("javax.annotation.")
            || annotationClass.startsWith("javax.ejb")
            || annotationClass.equals("org.apache.tapestry5.annotations.Persist")
            || annotationClass.equals("org.jboss.seam.annotations.In")
            || annotationClass.startsWith("javax.persistence")
            || annotationClass.endsWith("SpringBean")
            || annotationClass.equals("com.google.inject.Inject")
            || annotationClass.startsWith("com.google.") && annotationClass.endsWith(".Bind")
            && annotationClass.hashCode() == -243168318
            || annotationClass.startsWith("org.nuxeo.common.xmap.annotation")
            || annotationClass.startsWith("com.google.gwt.uibinder.client")
            || annotationClass.startsWith("org.springframework.beans.factory.annotation")
            || annotationClass.equals("javax.ws.rs.core.Context")) {
        return true;
    }
    int lastDot = annotationClass.lastIndexOf('.');
    String lastPart = annotationClass.substring(lastDot + 1);
    if (lastPart.startsWith("Inject")) {
        return true;
    }
    return false;
}

Таким образом, аннотации, подобные @EJB, не отображаются как ошибки UR, но моя аннотация @CustomInjection всегда будет ошибкой UR.

Но в конце функции есть escape для всех имен аннотаций, начинающихся с "Inject", поэтому, если я переименую @CustomInjection в @InjectCustom, ошибка UR исчезнет. Поэтому, чтобы избежать этой проблемы, просто переименуйте свою аннотацию в @InjectSomething.

Ответ 2

Если вы не можете сделать это напрямую, напишите предварительный процессор, который обнаруживает аннотацию и генерирует код, который инициализирует поле чем-то, что сделает его использование корректным для FindBugs. Подайте вывод предварительного процессора на FindBugs вместо исходного исходного кода.