与Jersey,Guice配置一起提供静态文件

时间:2013-03-17 21:57:29

标签: jersey jetty guice guice-servlet

我有以下配置作为Guice模块(而不是web.xml)

public class RestModule extends JerseyServletModule {
@Override
protected void configureServlets() {
    install(new JpaPersistModule("myDB"));
    filter("/*").through(PersistFilter.class);

    bind(CustomerList.class);
    bind(OrdersList.class);

    bind(MessageBodyReader.class).to(JacksonJsonProvider.class);
    bind(MessageBodyWriter.class).to(JacksonJsonProvider.class);

    ImmutableMap<String, String> settings = ImmutableMap.of(
            JSONConfiguration.FEATURE_POJO_MAPPING, "true"
            );

    serve("/*").with(GuiceContainer.class, settings);
}
}

提供REST端点确实可以很好地工作。

当用户请求http://example.com/

时,我想从/webapp/index.html提供静态html文件

以及http://example.com/customershttp://example.com/orders

的其他服务

我不使用web.xml。网络服务器是码头

2 个答案:

答案 0 :(得分:2)

请参阅:Jersey /* servlet mapping causes 404 error for static resources 并将适当的参数添加到settings对象。类似的东西:

ImmutableMap<String, String> settings = ImmutableMap.of(
  JSONConfiguration.FEATURE_POJO_MAPPING, "true"
  "com.sun.jersey.config.property.WebPageContentRegex", "/.*html");

答案 1 :(得分:2)

正如我在评论中所说,我几乎整天都在努力。 condit链接到正确答案,但为了完整性,这对我有用。我使用的是Tomcat,jersey(和jersey-guice)1.17.1,以及guice 3.0。

虽然我正在使用Tomcat,但困难的部分(服务静态资源)不应该那么不同。

public class JerseyConfig extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new JerseyServletModule() {
            @Override
            protected void configureServlets() {

                // Bind  REST resources
                bind(HomeController.class);
                bind(AboutController.class);

                Map<String, String> params = new HashMap<String, String>();
                params.put("com.sun.jersey.config.property.WebPageContentRegex",
                    "/(images|css)/.*");
                filter("/*").through(GuiceContainer.class, params);
            }
        });
    }
}

注意:最后两行是最重要的。

首先,忽略静态文件的参数:

"com.sun.jersey.config.property.WebPageContentRegex" (1.7 only!!!)

我将此设置为正则表达式:

"/(images|css)/.*"

...因为我的静态资源位于src / main / webapp / images和src / main / webapp / css(我正在使用maven项目结构)。例如:

http://localhost:8080/myapp/images/logo.png

(这仅适用于jersey 1.7.x - 如果你使用的是jersey 2.x,你应该使用密钥“jersey.config.servlet.filter.staticContentRegex”或理想的Java常量ServletProperties.FILTER_STATIC_CONTENT_REGEX)。 / p>

最后,最后一行:

filter("/*").through(GuiceContainer.class, params);

您应该使用:filter(“/ *”)。through和NOT serve(“/ *)。with

如果你提出了不同的解决方案,我想看看它是什么。