使用Jetty/Jersey/Guice提供静态内容的服务

4
与另一个问题类似(参见Filtering static content Jersey),我想从Jetty提供静态内容。有许多类似的问题分散在广阔的互联网上,但是大多数问题都不涉及Guice,而涉及Guice的那些问题已经过时了。
我有一个现有的服务,使用Jersey(1.12)和Guice(3),具有以下web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
    <display-name>My Service</display-name>

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

    <listener>
        <listener-class>com.example.MyGuiceConfig</listener-class>
    </listener>

    <filter>
        <filter-name>Guice Filter</filter-name>
        <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Guice Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

MyGuiceConfig看起来像这样:

public class MyGuiceConfig extends GuiceServletContextListener
{
    @Override
    protected Injector getInjector()
    {
        return Guice.createInjector(new JerseyServletModule()
        {
            @Override
            protected void configureServlets()
            {
                bind(SomeResource.class);
                bind(SomeDao.class).to(ConcreteSomeDao.class);
                serve("/*").with(GuiceContainer.class);
            }
        });
    }
}

当我使用命令mvn jetty:run来调用jetty-maven-plugin时,我的服务能够正常工作。但是,任何对静态内容的请求都会产生404错误。
如何在不影响服务的情况下提供任意静态内容?(即最小的更改,不需要改变技术栈)

看看这个对你有没有帮助:http://stackoverflow.com/questions/10567699/getting-http-500-when-running-servlet-in-jetty/10609507#10609507 - ant
1个回答

4
你如何在JerseyServletModule中配置URL片段?如果指定一个不与静态内容冲突的前缀,它应该可以工作。
public class Config extends GuiceServletContextListener {

  protected Injector getInjector() {
    return Guice.createInjector(
        new JerseyServletModule() {
          protected void configureServlets() {
            bind(Service.class);
            serve("/services/*").with(GuiceContainer.class);
          }
        });
  }

}

并且

@Singleton
@Path("/service")
@Produces({MediaType.TEXT_PLAIN})
public class Service {

  @GET
  public String run() {
    return "Service running";
  }

}

应该从host:8080/services/service提供Servlet.class并提供包含在Web应用程序中的静态资源...

编辑 参见Jersey /* servlet mapping causes 404 error for static resources以了解另一种在不更改REST端点路径的情况下完成此操作的方法。


وˆ‘و²،وœ‰JerseyServletModuleم€‚هˆ›ه»؛وˆ–وڈگن¾›.warوک¯ن¸چه؟…è¦پçڑ„م€‚ - Shaggy Frog
你在com.example.MyGuiceConfig中配置了什么?你如何告知Guice注入哪些Jersey服务类? - condit
哦,对不起,你是正确的。它在MyGuiceConfig中。我已经发布了代码。 - Shaggy Frog
如果您要求Jetty GuiceContainer提供“/*”,我认为它将拦截每个请求,而不知道静态资源。您能否将该路径更改为“/services/*”或类似的内容?然后GuiceContainer就不应该遮盖您的静态资源。 - condit
感谢您的帮助。在我将容器更改为服务于“/api/*”并清除了一些旧的垃圾之后,它正在提供静态资源。 - Shaggy Frog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接