简单的 Dropwizard 0.7.1 应用程序故障转移可选的 QueryParam w/ Java 8

Simple Dropwizard 0.7.1 App Failing over Optional QueryParam w/ Java 8

在与 Spring 长期交往后,我决定 return 加入 Dropwizard。我很快就构建了绝对准系统的 REST 服务,它运行没有任何问题。

使用Dropwizard 0.7.1和Java1.8,只有POM条目是dropwizard-core依赖和maven编译器插件强制执行Java1.8 ,按照 Dropwizard 用户手册的推荐

但是,一旦我尝试向基本控制器添加一个 Optional QueryParam,应用程序就无法启动并出现以下错误(为简洁起见,删除):

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: com.sun.jersey.spi.container.servlet.ServletContainer-6c2ed0cd@330103b7==com.sun.jersey.spi.container.servlet.ServletContainer,1,false

控制器的代码如下:

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

如果我从组合中删除 Optional,应用程序运行得很好。我用 null 检查替换了 Optional-specific 代码,它工作得很好。

我是不是漏掉了一些基本的东西? Google Guava Optional 和 java.util.Optional 都因同样的错误而失败。 (是的,我确实将其缩小到可选对象)

快速 Google/SO 搜索没有找到任何有用的信息,但请随时向我指出我可能错过的资源

提前致谢!

发帖后不久,我发现问题出在我使用 Java 1.8 上。如果使用 Java 1.8,我必须将 Java8Bundle 添加到我的应用程序中:

POM 条目:

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

应用程序中的代码class:

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

参见:https://github.com/dropwizard/dropwizard-java8

这使得 Google Guava Optional 和 java.util.Optional 都可以正常工作。

如果我恢复到 Java 1.7 并使用 Google Guava Optional,它也可以正常工作,而且我不必包含 Java8Bundle。不过,我现在会选择 Java8Bundle,因为使用 Java8 功能对我来说很有利可图:)

干杯!