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

时间:2015-01-03 18:03:18

标签: dropwizard

经过与Spring的长期恋情后,我决定回到Dropwizard。我很快就建立了绝对的准系统REST服务,它运行没有任何问题。

使用 Dropwizard 0.7.1和Java 1.8 ,只有POM条目是dropwizard-core依赖项和maven编译器插件来强制执行Java 1.8,按照Dropwizard用户手册的建议

但是,只要我尝试将可选的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特定的代码,它完美地运行。

我错过了一些基本的东西吗? Google Guava Optional和java.util.Optional都失败并出现相同的错误。 (是的,我确实将它缩小到Optional对象)

快速的Google / SO搜索没有任何用处,但请随意指出我可能错过的资源

提前致谢!

1 个答案:

答案 0 :(得分:11)

发布此消息后,我发现问题在于我使用的是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>

Application类中的代码:

@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功能对我来说是有利可图的:)

干杯!