2012-11-09 10 views
9

Ho il semplice codice qui sotto per testare l'annotazione FindBugs @NonNull con Maven. EseguoImposta findbug NotNull come predefinito per tutte le classi in un pacchetto

mvn clean install 

E viene a mancare in modo corretto per costruire perché print(null) viola la condizione di non nullo.

È possibile impostare NonNull come predefinita per tutti i parametri del metodo all'interno di una classe utilizzando l'annotazione di classe

@DefaultAnnotation(NonNull.class) 

Come posso impostare NonNull come predefinita per tutti i parametri del metodo all'interno di tutte le classi sotto un determinato pacchetto (e sub- Pacchetti)?

src/main/java/test/Hello.java

package test; 
import edu.umd.cs.findbugs.annotations.NonNull; 
public class Hello { 
    static public void print(@NonNull Object value) { 
     System.out.println("value: " + value.toString()); 
    } 

    static public void main(String[] args) { 
     if (args.length > 0) { 
      print(args[0]); 
     } else { 
      print(null); 
     } 
    } 
} 

pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>hello</groupId> 
    <artifactId>hello</artifactId> 
    <version>1.0</version> 

    <dependencies> 
    <dependency> 
     <groupId>net.sourceforge.findbugs</groupId> 
     <artifactId>annotations</artifactId> 
     <version>1.3.2</version> 
    </dependency> 
    <dependency> 
     <groupId>net.sourceforge.findbugs</groupId> 
     <artifactId>jsr305</artifactId> 
     <version>1.3.7</version> 
    </dependency> 
    </dependencies> 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <configuration> 
      <source>1.6</source> 
      <target>1.6</target> 
     </configuration> 
     </plugin> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>findbugs-maven-plugin</artifactId> 
     <version>2.5.2</version> 
     <configuration> 
      <includeTests>true</includeTests> 
     </configuration> 
     <executions> 
      <execution> 
      <phase>compile</phase> 
      <goals> 
       <goal>check</goal> 
      </goals> 
      </execution> 
      <execution> 
      <id>findbugs-test-compile</id> 
      <phase>test-compile</phase> 
      <goals> 
       <goal>check</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

risposta

15

Si può fare questo per i singoli pacchetti, ma non ho trovato un modo per avere propagare a sottopacchetti. Per i parametri del metodo, utilizzare l'annotazione del pacchetto integrata @ParametersAreNonnullByDefault. Applica l'annotazione al pacchetto nel suo file package-info.java all'interno della directory del pacchetto.

Nota che sto usando i javax.annotation annotazioni da JSR-305 che onora FindBugs.

com/example/foo/package-info.java

/** 
* Package that doesn't allow null values as method parameters. 
*/ 
@ParametersAreNonnullByDefault 
package com.example.foo; 

import javax.annotation.ParametersAreNonnullByDefault; 

Per i campi ei valori di ritorno metodo di cui hai bisogno per creare le proprie annotazioni. Ho fatto questo copiando la fonte per ParametersAreNonnullByDefault e cambiando l'enum ElementType.

com/example/util/FieldsAreNonnullByDefault.java

package com.example.util; 

import java.lang.annotation.Documented; 
import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 

import javax.annotation.Nonnull; 
import javax.annotation.meta.TypeQualifierDefault; 

/** 
* Applies the {@link Nonnull} annotation to every class field unless overridden. 
*/ 
@Documented 
@Nonnull 
@TypeQualifierDefault(ElementType.FIELD) // <-- use METHOD for return values 
@Retention(RetentionPolicy.RUNTIME) 
public @interface FieldsAreNonnullByDefault 
{ 
    // nothing to add 
} 

ho iniziato la riscrittura di un sistema abbastanza complesso da zero un paio di mesi fa, e ogni pacchetto ha queste tre annotazioni applicate (campi, parametri e valori di ritorno). Un vantaggio che è venuto fuori dall'incentivo per evitare i valori null sta utilizzando il modello Oggetto Nullo, ove appropriato. Questo, combinato con il favorire i campi finali il più possibile e le piccole classi che fanno una sola cosa, hanno davvero mantenuto il codice pulito.

1

È possibile farlo ai parametri, Campi e il valore di ritorno del metodo contemporaneamente mettendo queste linee nel vostro package-info.java:

@DefaultAnnotation(NonNull.class) 
package com.my.package; 

Quando findbugs corre sul codice in quel pacchetto, tutti i metodi e campi si presume che non siano nulli a meno che non li annoti con @CheckForNull.

Inoltre, non conosco un modo per rendere questo applicabile ai sotto-pacchetti. Lo faccio per ogni pacchetto.

Problemi correlati