如何正确使用guice进行Java servlet中的依赖项注入?

问题描述

很抱歉输入错误标题...
免责声明:在网络应用程序方面没有太多经验,主要是使用dropwizard。

所以我一直在尝试在Java Web应用程序中使用guice
最初没有guice,但servlet正确地服务了api,但在将servlet配置为从guice为以下端点提供服务之后,

http://localhost:8080/myServlets/test

我遇到以下错误

HTTP状态404 –找不到类型状态报告

消息请求的资源[/ myServlets / test]不可用

说明原始服务器未找到当前表示 获取目标资源或不愿意透露其存在。

Apache Tomcat / 8.5.57

具有以下stacktrace:

16-Sep-2020 11:33:43.941 INFO [AsyncFileHandlerWriter-2008362258] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading Illegal access: this web application instance has been stopped already. Could not load [com.google.inject.internal.util.LineNumbers$LineNumberReader]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
    java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [com.google.inject.internal.util.LineNumbers$LineNumberReader]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
        at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1378)
        at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1366)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1218)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1180)
        at com.google.inject.internal.util.StackTraceElements$1.load(StackTraceElements.java:49)
        at com.google.inject.internal.util.StackTraceElements$1.load(StackTraceElements.java:45)
        at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3529)
        at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2278)
        at com.google.common.cache.LocalCache$Segment.lockedGetorLoad(LocalCache.java:2155)
        at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2045)
        at com.google.common.cache.LocalCache.get(LocalCache.java:3953)
        at com.google.common.cache.LocalCache.getorLoad(LocalCache.java:3976)
        at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4960)
        at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4966)
        at com.google.inject.internal.util.StackTraceElements.forMember(StackTraceElements.java:71)
        at com.google.inject.internal.Messages.formatParameter(Messages.java:286)
        at com.google.inject.internal.Messages.formatInjectionPoint(Messages.java:273)
        at com.google.inject.internal.Messages.formatSource(Messages.java:229)
        at com.google.inject.internal.Messages.formatSource(Messages.java:220)
        at com.google.inject.internal.Messages.formatMessages(Messages.java:90)
        at com.google.inject.ConfigurationException.getMessage(ConfigurationException.java:73)
        at java.base/java.lang.Throwable.getLocalizedMessage(Throwable.java:396)
        at java.base/java.lang.Throwable.toString(Throwable.java:485)
        at java.base/java.lang.String.valueOf(String.java:2951)
        at java.base/java.io.PrintWriter.println(PrintWriter.java:837)
        at org.apache.juli.OneLineFormatter$IndentingPrintWriter.println(OneLineFormatter.java:298)
        at java.base/java.lang.Throwable$WrappedPrintWriter.println(Throwable.java:768)
        at java.base/java.lang.Throwable.printstacktrace(Throwable.java:659)
        at java.base/java.lang.Throwable.printstacktrace(Throwable.java:725)
        at org.apache.juli.OneLineFormatter.format(OneLineFormatter.java:171)
        at org.apache.juli.FileHandler.publish(FileHandler.java:291)
        at org.apache.juli.AsyncFileHandler.publishInternal(AsyncFileHandler.java:146)
        at org.apache.juli.AsyncFileHandler$LogEntry.flush(AsyncFileHandler.java:185)
        at org.apache.juli.AsyncFileHandler$LoggerThread.run(AsyncFileHandler.java:161)

尝试了Guice Git,但由于没有createInjector方法main部分让我感到困惑。

下面是参考代码,不胜感激!

CacheService

public interface CacheService {
    public abstract String hello();
}

CacheServiceImpl

import com.google.inject.Provides;

public class CacheServiceImpl implements CacheService {

    @Provides
    public String hello() {
        return "hello world";
    }
}

CacheModule

import com.google.inject.AbstractModule;

public class CacheModule extends AbstractModule {

    protected void configure() {
        bind(CacheService.class).to(CacheServiceImpl.class);
    }
}

MyGuiceServletConfig

public class MyGuiceServletConfig extends Guiceservletcontextlistener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new ServletModule() {
            @Override
            protected void configureServlets() {
                serve("/*").with(ResourceServlet.class);
                bind(CacheModule.class);
            }
        });
    }
}

ResourceServlet

@Slf4j
@Path("/")
@Singleton
public class ResourceServlet extends HttpServlet {

    @Context
    private ServletContext servletContext;

    @Inject
    public ResourceServlet(CacheService storageModule) throws JAXBException {
          log.info("base {}",storageModule.hello());
    }

    @GET
    @Path("/test")
    @Produces({MediaType.APPLICATION_JSON})
    public Product abc() {
        log.info("servletContext {}",servletContext);
        
    }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         id="WebApp_ID" version="3.1">
    <display-name>myServlets</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>

    <!-- Inject Guice -->
    <filter>
        <filter-name>guiceFilter</filter-name>
        <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>guiceFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <listener>
        <listener-class>com.myorg.application.guice.MyGuiceServletConfig</listener-class>
    </listener>
</web-app>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)