Java DropWizard服务资产需要帮助
救命啊!我已经试了好几个小时,用谷歌搜索我能想到的任何东西。我有一个问题,我想在我的网站上显示我的静态内容,而不是我的应用程序。 我修改了一个简单的hello world应用程序:Java DropWizard服务资产需要帮助,java,yaml,pom.xml,dropwizard,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
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);
}
我应用了一切,就像DropWizard文档()所说的那样。但是我无法访问index.html,我是通过使用AssetsBundle()类的默认构造函数来实现的 使用默认构造函数,您的资源将在java类路径上的目录中查找
/src/main/resources/assets/
并且您必须仅将应用程序命名为ContextPath/application
将浏览器指向静态内容的刷新位置
localhost:8080/application/assets/index.htm
我还没有看到一个实际的例子来证明文档化的方法确实有效。 在查看Dropwizard源代码时,我得出结论,这实际上是不可能的:Jetty应用程序上下文是由
SimpleServerFactory:103
中的配置参数applicationContextPath
设置的:
environment.getApplicationContext().setContextPath(applicationContextPath);
然后,在run()
(AssetBundle:109
)时将AssetBundle
注册到此应用程序上下文中:
因此,assetbundles始终在应用程序的YAML文件中设置的applicationContextPath
中提供,因此无法在此applicationContextPath之外提供服务(尽管文档中有这样的说法)
更好的方法是将应用程序配置为使用/
路径:
applicationContextPath: /
然后,在应用程序的代码中,在bootstrap()
和run()
方法中,显式覆盖Jersey资源的路径,并根据需要添加资产绑定:
bootstrap.addBundle(new AssetsBundle("/static", "/"));
environment.jersey().setUrlPattern("/application/*");
对于Dropwizard 0.8.0及更新版本,可通过以下配置实现:
applicationContextPath: /
rootPath: /application
其中applicationContextPath是Jetty的上下文路径,rootPath是Jersey的。正如Geert所提到的,需要从applicationContextPath中提供资产包。但是,如果在引导方法中添加AssetsBundle,并从run方法中设置contextPath,则AssetServlet将在设置contextPath后添加 我的解决方案是避免使用AssetsBundle,直接在run方法中添加AssetsServlet(在设置contextPath之后):
哇,非常感谢终于有人解决了这个问题。我的结论是,原来想要的设置是不可能的:从“/”路径提供静态包,从子路径提供Jersey应用程序。谢谢!这是我尝试过的唯一有效的方法。这是一个合适的解决方案,对我来说也是有效的。在深入研究之后,这项工作也出现在Google群组中:这在DropWizard 0.8.x中发生了变化。
bootstrap.addBundle(new AssetsBundle("/static", "/"));
environment.jersey().setUrlPattern("/application/*");
applicationContextPath: /
rootPath: /application
environment.getApplicationContext().setContextPath("/");
environment.servlets().addServlet("assets", new AssetServlet("/assets", "/", "index.html", StandardCharsets.UTF_8)).addMapping("/*");