Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DropWizard服务资产需要帮助_Java_Yaml_Pom.xml_Dropwizard - Fatal编程技术网

Java DropWizard服务资产需要帮助

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

救命啊!我已经试了好几个小时,用谷歌搜索我能想到的任何东西。我有一个问题,我想在我的网站上显示我的静态内容,而不是我的应用程序。 我修改了一个简单的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);
}

我应用了一切,就像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("/*");