有没有示例代码演示如何在Jersey 2.0中使用guice-servlet?
我刚刚开始在我的Tomcat webapp中使用Google Guice,并且只要取消部署WAR文件,就会在catalina.out文件中注意到以下内容:
May 16, 2011 5:37:24 PM org.apache.catalina.startup.HostConfig checkResources
INFO: Undeploying context [/app]
May 16, 2011 5:37:24 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads SEVERE: A web application appears to have started a thread named [com.google.inject.internal.util.$Finalizer] but has failed to stop it. This is very likely to create a memory leak.
May 16, 2011 5:37:24 PM org.apache.catalina.loader.WebappClassLoader clearThreadLocalMap SEVERE: A web application created a ThreadLocal with key of type [null] (value [com.google.inject.internal.InjectorImpl$1@10ace8d]) and a value of type [java.lang.Object[]] (value [[Ljava.lang.Object;@7e9bed]) but failed to …
我开始使用Guice/Shiro而不是Spring/Spring Security.我查看了Shiro站点的示例,所有配置示例都是作为INI文件示例制作的.是否可以在普通Java中配置Shiro,因为要配置Guice Servlet?
我有一个基本的JAXRS服务,我可以轻松地公开,但一次我希望使用依赖注入API,我怀疑Google Guice将是最好的之一.考虑到这一点,我试图整合它,但文档有点沉重,我不得不四处寻找尝试找到合适的组合
但是目前我从Google Guice那里得到错误,他们会根据我是否使用@InjectParam注释而改变.
如果我用@InjectParam注释,那么我得到
Mar 29, 2013 9:52:04 PM com.sun.jersey.spi.inject.Errors processErrorMessages
SEVERE: The following errors and warnings have been detected with resource and/or provider classes:
SEVERE: The class com.hillingar.server.dao.interfaces.UserDao is an interface and cannot be instantiated.
SEVERE: Missing dependency for constructor public com.hillingar.server.SessionUtility(com.hillingar.server.dao.interfaces.UserDao) at parameter index 0
Run Code Online (Sandbox Code Playgroud)
如果我没有注释,那么我得到
Mar 29, 2013 9:54:59 PM com.sun.jersey.spi.inject.Errors processErrorMessages
SEVERE: The following errors and warnings have been detected with resource and/or provider classes:
SEVERE: Missing …Run Code Online (Sandbox Code Playgroud) 我使用由Maven 3构建的gucie-servlet框架用Java编写的Web应用程序.当我在Tomcat 7容器上部署它并尝试使用浏览器访问它时,Tomcat回复404状态代码.这是来自Tomcat的日志:
Apr 4, 2013 11:39:50 AM org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextDestroyed()
Apr 4, 2013 11:39:50 AM org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextDestroyed()
Apr 4, 2013 11:39:55 AM org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class ru.hive.webserver.config.HiveServletConfig
java.lang.NoClassDefFoundError: ru/hive/base/db/modules/DatabaseModule
at ru.hive.webserver.config.HiveServletConfig.getInjector(HiveServletConfig.java:24)
at com.google.inject.servlet.GuiceServletContextListener.contextInitialized(GuiceServletContextListener.java:45)
at ru.hive.webserver.config.HiveServletConfig.contextInitialized(HiveServletConfig.java:19)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4797)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5291)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:977)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1655)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)
Caused by: …Run Code Online (Sandbox Code Playgroud) 我必须 在Weblogic 12c服务器(12.2.1)上使用两者(奇怪的是......)" prefer-web-inf-classes "和" web- to -application-packages"的weblogic.xml属性
它是基于Jersey 1.9的REST应用程序.*(Jersey 1.x JAX-RS RI)和Guice.
1.为什么要使用:prefer-web-inf-classes
如果你有多个WAR,你必须在war/lib的级别放置guice-jersey/guice的库,否则你会得到Multibindings Error.
它必须表明prefer-web-inf-classes为true. 这种方式正常!我试图以相同的方式使用prefer-application-packages和package(com.sun.jersey.guice.spi.container.servlet /com.google.inject.servlet等等),但没办法.
注意:无法在EAR级别排除此库.
2.为什么要使用:prefer-application-packages
要在Weblogic 12c(12.2.1)上使用Jersey 1.x JAX-RS RI,所以我必须指出以下包(Weblogic使用Jersey 2的其他方式,以及不同版本的Jackson库等)
如果以这种方式表示,它在Jersey 1.X上完美运行..我已分别探讨了两场战争,并且工作得很好......但是,请记住我的朋友我有两场战争......所以....
摘要
我不能同时使用这两个属性(在weblogic.xml上使用这两个属性部署错误..),但它需要:
问题:如何将两者结合使用其中之一?
由于ServletContextListener是由服务器创建的,而不是由Guice创建的,因此无法找到让它一起工作的方法.如何在ServletContextListener中获取guice注入器?
也许有更好的方法可以关闭logger或persistance之类的服务,然后在contextDestroyed方法中执行它并在contextInitialized中初始化它们?
servlets dependency-injection guice servlet-listeners guice-servlet
我有一个两难选择在我的GAE的Java应用程序:我想写将由GAE后端处理一个servlet 和它也必须用Guice的依赖注入启动所有servlet的领域.我尝试了多种方法,但似乎没有人为我做这个伎俩.
我首先尝试在servlet中使用Sitebricks,但似乎这样做会导致GAE在查询后端URL时无法将类检测为合法的servlet:始终从后端返回404 Not Found.尽管如此,我确信该类使用Sitebricks注释正确注释,因为相同的URI路径与前端实例一起工作正常.
接下来,我尝试使用Guice Servlet Extension(参见此链接); 在我创建全局的类中Injector,我使用了这个绑定:
return Guice.createInjector(..., new ServletModule() {
@Override
protected void configureServlets() {
serve("/backend/*").with(MyBackend.class);
}
}, ...);
Run Code Online (Sandbox Code Playgroud)
不幸的是,与Sitebricks发生的问题完全相同:我在后端返回404错误,但在前端没有.
最后一种可行的方法是配置servlet-mapping web.xml; 传统的方法.这最终允许我的后端检测URI映射(随后是Google的Java GAE后端文档中写的内容:"后端与主应用程序版本共享web.xml中定义的servlet.").不幸的是,我无法利用Guice注射器使用这个程序,因此我非常不希望使用它web.xml.
我甚至尝试结合第二种和第三种方法:同时使用Guice Servlet Extension和web.xml.这个错误从后端返回500错误,并出现此错误:
java.lang.InstantiationException: com.example.MyBackend
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153)
at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:428)
at org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:339)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.tools.development.BackendServersFilter.doRedirectedServerRequest(BackendServersFilter.java:292)
at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:106)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at …Run Code Online (Sandbox Code Playgroud) 我正在尝试更新遗留的Guice应用程序,我想知道在考虑Servlet 3.0注释时是否有任何一种首选的方法.例如,我的应用程序有一个过滤器FooFilter,它在Guice Module Factory方法configureServlets()中定义,如下所示:
Map<String, String> fooParams = new HashMap<String, String>();
fooParams.put("someParam", "parameter information");
filter("/foo.jsp","/foo/*").through(com.example.filter.FooFilter.class, fooParams);
Run Code Online (Sandbox Code Playgroud)
以上绑定是否仍然必要,或者它是否会使用@WebFilter Servlet 3.0注释干扰以下内容:
@Singleton
@WebFilter(
filterName="FooFilter",
urlPatterns={"/foo.jsp", "/foo/*"},
initParams = {
@WebInitParam(name="foo", value="Hello "),
@WebInitParam(name="bar", value=" World!")
})
public class FooFilter implements Filter {
etc....
Run Code Online (Sandbox Code Playgroud)
现在首选哪种方法?他们会互相混乱吗?
我在tomcat中使用Guice-servlets和websocket创建了一个示例webapp,现在一次使用guice过滤器websocket停止工作
在我的web.xml中,我使用了初始化Guiceservlet GuiceBasedListener
<web-app>
<listener>
<listener-class>test.GuiceBasedListener</listener-class>
</listener>
<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>
</web-app>
Run Code Online (Sandbox Code Playgroud)
GuieBasedListener将所有请求绑定/*到的代码MyDispatcher
public class GuiceBasedListener extends GuiceServletContextListener {
protected Injector getInjector() {
return Guice.createInjector( new ServletModule() {
@Override
protected void configureServlets() {
bind(MyDispatcher.class).asEagerSingleton();
serve("/*").with(MyDispatcher.class);//////IMPORTANT LINE//
}
});}}
Run Code Online (Sandbox Code Playgroud)
MyDispatcher 只用String响应的代码
public class MyDispatcher extends HttpServlet {
@Inject private Injector injector;
public MyDispatcher() {}
public void service(ServletRequest req, ServletResponse resp) throws IOException, ServletException {
resp.getOutputStream().print("SUCCESS:" + req);
}
}
Run Code Online (Sandbox Code Playgroud)
我还有一个@ServerEndPoint for Websocket …
guice-servlet ×10
guice ×7
java ×4
servlets ×3
tomcat ×2
annotations ×1
jax-rs ×1
jersey ×1
jersey-1.0 ×1
jersey-2.0 ×1
jsr356 ×1
maven ×1
maven-3 ×1
servlet-3.0 ×1
shiro ×1
sitebricks ×1
tomcat7 ×1
weblogic12c ×1
websocket ×1