DropWizard服务资产需要帮助

时间:2014-07-18 10:32:24

标签: java yaml pom.xml dropwizard

帮助!我已经尝试了几个小时,谷歌搜索任何我能想到的东西。我有一个问题,我想在我的网站上显示我的静态内容而不是我的应用程序。 我修改了一个简单的hello-world应用程序:

public static void main(String[] args) throws Exception {
    Class.forName("org.sqlite.JDBC");
    new HelloWorldApplication().run(args);
}

@Override
public String getName() {
    return "hello-world";
}

@Override
public void initialize(Bootstrap<HelloWorldConfiguration> bootstrap) {
    bootstrap.addBundle(new AssetsBundle("/assets/*", "/"));
}

@Override
public void run(HelloWorldConfiguration configuration, Environment environment) {
    final HelloWorldResource resource = new HelloWorldResource(
            configuration.getTemplate(),
            configuration.getDefaultName()
        );
    final AddResource addResource = new AddResource();
    final DeleteResource deleteResource = new DeleteResource();
    final TemplateHealthCheck healthCheck = new TemplateHealthCheck(configuration.getTemplate());
    environment.healthChecks().register("template", healthCheck);
    environment.jersey().register(resource);
    environment.jersey().register(addResource);
    environment.jersey().register(deleteResource);
}

这是我的hello-world.yml:

server:
  type: simple
  applicationContextPath: /application/hello-world

template: Hello, %s!
defaultName: Stranger

我应用了所有内容,DropWizard文档(http://dropwizard.readthedocs.org/en/latest/manual/core.html#serving-assets)所说的内容。但我无法设法达到index.html

4 个答案:

答案 0 :(得分:5)

我还没有看到一个证明所记录的方式确实有效的实际例子。 在查看Dropwizard源代码时,我得出结论,这实际上是不可能的:Jetty应用程序上下文由applicationContextPath中的配置参数SimpleServerFactory:103设置:

environment.getApplicationContext().setContextPath(applicationContextPath);

之后,AssetBundlerun()AssetBundle:109)注册到此applicationContext中:

environment.servlets().addServlet(assetsName, createServlet()).addMapping(uriPath + '*');

因此,assetbundles始终在在应用程序的YAML文件中设置的applicationContextPath内提供,因此无法在之外提供此applicationContextPath(尽管文件说的那样)

更好的方法是将应用程序配置为使用/路径:

applicationContextPath: /

然后,在您的应用程序代码中,在bootstrap()run()方法中,显式覆盖Jersey资源的路径并根据您的喜好添加AssetBundles:

bootstrap.addBundle(new AssetsBundle("/static", "/"));

environment.jersey().setUrlPattern("/application/*");

答案 1 :(得分:4)

我通过使用AssetsBundle()类的默认构造函数来实现它。

使用默认构造函数,您的资源将在java类路径的目录中查找,例如

/src/main/resources/assets/

并且您必须将applicationContextPath命名为/ application

将浏览器指向静态内容的后续位置

localhost:8080/application/assets/index.htm

答案 2 :(得分:1)

对于Dropwizard 0.8.0及更新版本,这是通过以下配置实现的:

applicationContextPath: /
rootPath: /application

其中applicationContextPath是Jetty的Context路径,rootPath是Jersey的。

答案 3 :(得分:0)

正如Geert所提到的,资产包需要从applicationContextPath中提供。但是,如果在引导方法中添加AssetsBundle,并从run方法设置contextPath,则在设置contextPath后添加AssetServlet。

我的修复是避免使用AssetsBundle并直接在run方法中添加AssetsServlet(在设置contextPath之后):

environment.getApplicationContext().setContextPath("/");
environment.servlets().addServlet("assets", new AssetServlet("/assets", "/", "index.html", StandardCharsets.UTF_8)).addMapping("/*");