帮助!我已经尝试了几个小时,谷歌搜索任何我能想到的东西。我有一个问题,我想在我的网站上显示我的静态内容而不是我的应用程序。 我修改了一个简单的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
答案 0 :(得分:5)
我还没有看到一个证明所记录的方式确实有效的实际例子。
在查看Dropwizard源代码时,我得出结论,这实际上是不可能的:Jetty应用程序上下文由applicationContextPath
中的配置参数SimpleServerFactory:103
设置:
environment.getApplicationContext().setContextPath(applicationContextPath);
之后,AssetBundle
在run()
(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("/*");