2015-01-03 6 views
6

Ho deciso di tornare a Dropwizard dopo un lungo periodo con Spring. Ho rapidamente ottenuto il servizio REST barebones assoluto costruito e funziona senza problemi.Semplice Dropwizard 0.7.1 Errore dell'applicazione su QueryParam opzionale con Java 8

Uso Dropwizard 0.7.1 e Java 1.8, solo voci POM sono la dipendenza dropwizard-core e il plugin maven compilatore di applicare Java 1.8, come raccomandato dal manuale Dropwizard

Tuttavia, come appena provo ad aggiungere un QueryParam opzionale al controller di base, l'applicazione non si avvia con il seguente errore (taglio per brevità):

INFO [2015-01-03 17:44:58,059] io.dropwizard.jersey.DropwizardResourceConfig: The following paths were found for the configured resources: 

    GET /(edge.dw.sample.controllers.IndexController) 

ERROR [2015-01-03 17:44:58,158] com.sun.jersey.spi.inject.Errors: The following errors and warnings have been detected with resource and/or provider classes: 
SEVERE: Missing dependency for method public java.lang.String edge.dw.sample.controllers.IndexController.index(java.util.Optional) at parameter at index 0 
Exception in thread "main" javax.servlet.ServletException: [email protected]30103b7==com.sun.jersey.spi.container.servlet.ServletContainer,1,false 

il codice per il controller è il seguente:

012.
@Path("/") 
public class IndexController { 

    @GET 
    @Timed 
    public String index(@QueryParam("name") Optional<String> name) { 
     String saying = "Hi"; 

     if(name != null && name.isPresent()) { 
      saying += " " + name.get(); 
     } 

     return saying; 
    } 
} 

Se rimuovo Opzionale dal mix, l'applicazione viene eseguita correttamente. Sostituisco il codice specifico opzionale con i controlli null e funziona perfettamente.

Mi manca qualcosa di fondamentale qui? Sia Google Guava Opzionale che java.util.Optional falliscono con lo stesso errore. (E sì, l'ho fatto stretto verso il basso per l'oggetto opzionale)

Un rapido Google/SO ricerca ha prodotto nulla di utile, ma sentitevi liberi di puntare a una risorsa forse ho perso

Grazie in anticipo!

risposta

11

Momenti dopo la pubblicazione di questo, ho trovato che il problema era il mio uso di Java 1.8. Se si utilizza Java 1.8, devo aggiungere il Java8Bundle alla mia app:

POM Entry:

<dependency> 
    <groupId>io.dropwizard.modules</groupId> 
    <artifactId>dropwizard-java8</artifactId> 
    <version>0.7.0-1</version> 
</dependency> 

E codice nella classe di applicazione:

@Override 
public void initialize(Bootstrap<SampleConfiguration> bootstrap) { 
    bootstrap.addBundle(new Java8Bundle()); 
} 

See: https://github.com/dropwizard/dropwizard-java8

Ciò consente a Google Guava Optional e java.util.Optional di funzionare correttamente.

Se ritorno a Java 1.7 e utilizzo Google Guava Opzionale, funziona anche bene e non è necessario includere Java8Bundle. Opterò per Java8Bundle per ora, però, poiché usare le funzionalità di Java8 è per me lucrativo :)

Cheers!

+0

Guava Opzionale è gestito di default da dropwizard, solo FYI. Non dimenticare di segnare la risposta. – Natan

+0

Grazie, è stata un'avventura di 45 minuti di debugging confuso. – Joe