2017-03-29 77 views
2

我正在写一个使用Guice作为我的DI框架和Hibernate作为我的Orm的java应用程序。我想运行一个简单的嵌入式Jetty服务器来提供几个jsp页面。我设法使用下面的代码来运行服务器:JSP bean中的Guice注入

Server server = new Server(8081); 
final WebAppContext webAppContext = new WebAppContext(); 
webAppContext.setContextPath("/rpga"); 
webAppContext.setResourceBase("web/WEB-INF/"); 
webAppContext.setDescriptor("web/WEB-INF/web.xml"); 
webAppContext.setParentLoaderPriority(true); 

final Configuration.ClassList classlist = Configuration.ClassList.setServerDefault(server); 
classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration","org.eclipse.jetty.annotations.AnnotationConfiguration"); 

webAppContext.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",".*/[^/]*servlet-api-[^/]*\\.jar$|.*/javax.servlet.jsp.jstl-.*\\.jar$|.*/[^/]*taglibs.*\\.jar$|.*/classes/.*"); 

webAppContext.setServer(server); 

server.setHandler(webAppContext); 
server.start(); 
server.join(); 

现在我想用几个简单的豆在我的jsp添加一些数据。我尝试创建一个bean并注入其中的dao,但由于bean不是由Guice管理的,因此不会注入Dao。

我的JSP看起来像

<html> 
    <head> 
     <title>Playlist</title> 
    </head> 
    <body> 
     <jsp:useBean id="playlist" class="com.duom.beans.PlaylistBean" /> 
     ...do stuff with playlistBean 
    </body> 
</html> 

我的豆:

import com.google.inject.Inject; 

public class PlaylistBean { 

    @Inject 
    private PlaylistDao playlistDao; 

    ...do stuff 
} 

缺少什么我实现我的目标是什么?

+0

我不认为你可以。如果你想在JSP中使用DI,你需要使用Java EE的CDI框架。除非你想让你自己的JSP标签调用一个工厂直接传递给Guice注入器来获取实例。 (请注意,这绝对是一个黑客,而不是一个好的)。 –

+0

感谢您的回复,我终于找到了解决方案,看到我的答案在下面! – Duom

回答

1

我设法找到解决我的问题。我设法清理了我的意图,并使用正确的技术重新启动我的开发人员。

我从JSP切换到JSF2,我创建了吉斯喷射器工厂类:

public class GuiceFactory { 

    private static final Injector injector = Guice.createInjector(new RpgaAppModule()); 

    public static Injector getInjector() { 
     return injector; 
    } 
} 

然后在我的豆子的每个构造我打电话:

GuiceFactory.getInjector().injectMembers(this); 

不要犹豫,如果我的解决方案在设计或架构方面是错误的,请留言。