2015-01-03 9 views
6

Postanowiłem wrócić do Dropwizard po bardzo długiej romansie ze Spring. Szybko udało mi się zbudować absolutny szkielet usługi REST i działa bez żadnych problemów.Prosta awaria aplikacji 0.7.1 Dropwizard przez opcjonalne zapytanie QueryParam w/Java 8

Korzystanie Dropwizard 0.7.1 i Java 1.8, tylko POM wpisy są zależność dropwizard-core i plugin Maven kompilator egzekwować Java 1.8, zgodnie z zaleceniami instrukcji obsługi Dropwizard

Jednakże, jak szybko, jak próbuję dodać opcjonalny QueryParam do podstawowego kontrolera, aplikacja nie daje się uruchomić z powodu następującego błędu (cut dla zwięzłość):

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 

Kod dla kontrolera jest następująca:

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

Jeśli usunę Opcjonalne z miksu, aplikacja działa dobrze. Zastępuję kod specyficzny dla Opcji z kontrolami zerowymi i działa idealnie.

Czy brakuje mi czegoś fundamentalnego? Zarówno Google Guava Opcjonalne, jak i java.util.Optional nie działają z tym samym błędem. (I tak, zrobiłem sprowadzić do opcjonalnego obiektu)

Szybkie Google/Więc szukaj niczego przydatnego dało, ale czuć się swobodnie wskazać mi do zasobu może mam nieodebranych

Z góry dzięki!

Odpowiedz

11

Chwile po opublikowaniu tego, okazało się, że problemem było moje korzystanie z Javy 1.8. W przypadku korzystania z Java 1.8, muszę dodać Java8Bundle do mojego app:

POM wpis:

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

i kod w klasie Application:

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

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

Dzięki temu zarówno Google Guava Opcjonalne, jak i java.util.Optional działają dobrze.

Jeśli powrócę do wersji Java 1.7 i skorzystam z opcji Google Guava Opcjonalnie, działa ona również dobrze i nie muszę uwzględniać Java8Bundle. Zdecyduję się na Java8Bundle na razie, ponieważ korzystanie z funkcji Java8 jest dla mnie lukratywne :)

Pozdrawiam!

+0

Guava Opcjonalne jest domyślnie obsługiwane przez dropwizard, tylko na nie. Nie zapomnij zaznaczyć odpowiedzi. – Natan

+0

Dziękuję, to była 45-minutowa przygoda z zagmatwanym debugowaniem. – Joe