2014-05-22 8 views
15

Ich habe das ein von FindBugs berichteten Fehler, aber ich weiß es besser :) siehe folgendes Beispiel:Festlegen eines FindBugs-Filters für Felder mit einer bestimmten Anmerkung?

public class MyClass extends BaseClass { 

    @CustomInjection 
    private Object someField; 

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

In meinem Baseclass Konstruktor Ich spritze alle Felder mit der @CustomInjection Annotation mit dem richtigen Objekt so meine kommentierten Felder sind in meinem Fall nicht null.

Ich möchte die Warnung nicht mit 'suppresswarnings' unterdrücken, weil das den Code zu viel stört. Ich bevorzuge es, einen Filter wie Findbugs zu erstellen, erklärt here, aber ich kann nicht herausfinden, wie man Fehler für Felder, die mit einer bestimmten Schnittstelle kommentiert werden, filtert. Ich will auch nicht alle Null Bug Warnungen filtern. Ich denke, es sollte wie etwas sein:

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

Gute Frage! Ich denke nicht, dass das möglich ist. Eine Problemumgehung könnte darin bestehen, einen benutzerdefinierten Detektor zu schreiben, der zuerst nach konfigurierten Annotationen sucht und dann den ursprünglichen Detektor aufruft (sagen wir, ein Filterdetektor). Benutzerdefinierte Filter wären eine bessere Übereinstimmung, aber diese scheinen auch nicht zu existieren. –

Antwort

5

Ich habe eine Problemumgehung gefunden, um dieses Problem zu beheben. Es scheint Erkennung für Annotation basiert Einspritzung in FindBugs hart codiert finden Sie in diesem Stück Quellcode:

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; 
} 

So Anmerkungen wie @EJB nicht als UR Fehler gezeigt, aber meine Anmerkung @CustomInjection wird immer ein UR Fehler sein.

Aber am Ende der Funktion gibt es eine Escape-Funktion für alle Annotationsnamen, die mit "Inject" beginnen. Wenn ich also @CustomInjection in @InjectCustom umbenenne, verschwindet der UR-Bug. Um dieses Problem zu vermeiden, benennen Sie Ihre Annotation einfach in @InjectSomething um.

1

Wenn Sie es nicht direkt tun, einen Pre-Prozessor schreiben, die die Anmerkung erkennt und generiert Code, der das Feld mit etwas initialisiert, die ihre Anwendungen gültig aussehen würde FindBugs. Feed die Pre-Prozessor-Ausgabe zu FindBugs, anstelle des ursprünglichen Quellcodes.

Verwandte Themen