经过与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搜索没有任何用处,但请随意指出我可能错过的资源
提前致谢!
答案 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功能对我来说是有利可图的:)
干杯!