{"id":132,"date":"2009-06-19T21:30:55","date_gmt":"2009-06-20T04:30:55","guid":{"rendered":"http:\/\/www.connorgarvey.com\/blog\/?p=132"},"modified":"2010-02-12T09:00:46","modified_gmt":"2010-02-12T16:00:46","slug":"using-guice-with-flex-remoting-for-blazeds","status":"publish","type":"post","link":"https:\/\/connorgarvey.com\/blog\/?p=132","title":{"rendered":"Using Guice with Flex remoting for BlazeDS"},"content":{"rendered":"<p>I just finished putting a server together that uses <a href=\"http:\/\/code.google.com\/p\/google-guice\/\">Google&#8217;s Guice<\/a> and <a href=\"http:\/\/opensource.adobe.com\/wiki\/display\/blazeds\/BlazeDS\/\">Adobe&#8217;s BlazeDS<\/a>.\u00a0 Here&#8217;s how you can quickly get a project working using the same configuration.<\/p>\n<p>* <em>Update:<\/em> <a href=\"http:\/\/www.connorgarvey.com\/blog\/?p=163\">A new post describes using Guice&#8217;s ServletModule to configure the MessageBrokerServlet<\/a>.<\/p>\n<h3>Download the libraries<\/h3>\n<p>Download <a href=\"http:\/\/code.google.com\/p\/google-guice\/downloads\/list\">Guice<\/a> and <a href=\"http:\/\/opensource.adobe.com\/wiki\/display\/blazeds\/BlazeDS\/\">BlazeDS<\/a>.\u00a0 Use the project configured in the BlazeDS war to get started.<\/p>\n<h3>Create the Guice factory<\/h3>\n<p>Since BlazeDS provides the servlet, you won&#8217;t be able to configure your classes using Guice unless you have a Flex factory.\u00a0 This code will inject itself with Guice to get instances of Flex services.<\/p>\n<div id=\"wpshdo_1\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_1\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_1\"><\/a><a id=\"wpshat_1\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_1\"  onClick=\"javascript:wpsh_toggleBlock(1)\" title=\"Click to show\/hide code block\">Code block<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_1\" onClick=\"javascript:wpsh_code(1)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/connorgarvey.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_1\" onClick=\"javascript:wpsh_print(1)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/connorgarvey.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/connorgarvey.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/connorgarvey.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_1\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"java\" style=\"font-family:monospace;\"><span class=\"kw1\">package<\/span> <span class=\"co2\">com.connorgarvey.guiceblazeds.servlet<\/span><span class=\"sy0\">;<\/span>\n&nbsp;\n<span class=\"kw1\">import<\/span> <span class=\"co2\">java.util.HashMap<\/span><span class=\"sy0\">;<\/span>\n<span class=\"kw1\">import<\/span> <span class=\"co2\">java.util.Map<\/span><span class=\"sy0\">;<\/span>\n<span class=\"kw1\">import<\/span> <span class=\"co2\">com.google.inject.Injector<\/span><span class=\"sy0\">;<\/span>\n<span class=\"kw1\">import<\/span> <span class=\"co2\">flex.messaging.FactoryInstance<\/span><span class=\"sy0\">;<\/span>\n<span class=\"kw1\">import<\/span> <span class=\"co2\">flex.messaging.FlexContext<\/span><span class=\"sy0\">;<\/span>\n<span class=\"kw1\">import<\/span> <span class=\"co2\">flex.messaging.FlexFactory<\/span><span class=\"sy0\">;<\/span>\n<span class=\"kw1\">import<\/span> <span class=\"co2\">flex.messaging.config.ConfigMap<\/span><span class=\"sy0\">;<\/span>\n<span class=\"kw1\">import<\/span> <span class=\"co2\">flex.messaging.services.ServiceException<\/span><span class=\"sy0\">;<\/span>\n&nbsp;\n<span class=\"co3\">\/**\n * &lt;p&gt;A Flex factory that retrieves instances of Flex services from Guice&lt;\/p&gt;\n * &lt;p&gt;This is based on a similar factory built for Spring by Jeff Vroom&lt;\/p&gt;\n * @author Connor Garvey\n * @created May 27, 2009 1:09:49 PM\n * @version 1.0.0\n * @since 1.0.0\n *\/<\/span>\n<span class=\"kw1\">public<\/span> <span class=\"kw1\">class<\/span> GuiceFactory <span class=\"kw1\">implements<\/span> FlexFactory <span class=\"br0\">&#123;<\/span>\n  <span class=\"kw1\">private<\/span> <span class=\"kw1\">static<\/span> <span class=\"kw1\">final<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky\"><span class=\"kw3\">String<\/span><\/a> SOURCE <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;source&quot;<\/span><span class=\"sy0\">;<\/span>\n&nbsp;\n  <span class=\"co3\">\/**\n   * @see flex.messaging.FlexFactory#createFactoryInstance(java.lang.String, flex.messaging.config.ConfigMap)\n   *\/<\/span>\n  <span class=\"kw1\">public<\/span> FactoryInstance createFactoryInstance<span class=\"br0\">&#40;<\/span><span class=\"kw1\">final<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky\"><span class=\"kw3\">String<\/span><\/a> id, <span class=\"kw1\">final<\/span> ConfigMap properties<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n    <span class=\"kw1\">final<\/span> GuiceFactoryInstance instance <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> GuiceFactoryInstance<span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>, id, properties<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n    instance.<span class=\"me1\">setSource<\/span><span class=\"br0\">&#40;<\/span>properties.<span class=\"me1\">getPropertyAsString<\/span><span class=\"br0\">&#40;<\/span>SOURCE, instance.<span class=\"me1\">getId<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"kw1\">return<\/span> instance<span class=\"sy0\">;<\/span>\n  <span class=\"br0\">&#125;<\/span>\n&nbsp;\n  <span class=\"co3\">\/**\n   * @see flex.messaging.FlexConfigurable#initialize(java.lang.String, flex.messaging.config.ConfigMap)\n   *\/<\/span>\n  <span class=\"kw1\">public<\/span> <span class=\"kw4\">void<\/span> initialize<span class=\"br0\">&#40;<\/span><span class=\"kw1\">final<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky\"><span class=\"kw3\">String<\/span><\/a> id, <span class=\"kw1\">final<\/span> ConfigMap configMap<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n  <span class=\"br0\">&#125;<\/span>\n&nbsp;\n  <span class=\"co3\">\/**\n   * @see flex.messaging.FlexFactory#lookup(flex.messaging.FactoryInstance)\n   *\/<\/span>\n  <span class=\"kw1\">public<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Aobject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky\"><span class=\"kw3\">Object<\/span><\/a> lookup<span class=\"br0\">&#40;<\/span><span class=\"kw1\">final<\/span> FactoryInstance inst<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n    <span class=\"kw1\">return<\/span> inst.<span class=\"me1\">lookup<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n  <span class=\"br0\">&#125;<\/span>\n&nbsp;\n  <span class=\"kw1\">static<\/span> <span class=\"kw1\">class<\/span> GuiceFactoryInstance <span class=\"kw1\">extends<\/span> FactoryInstance <span class=\"br0\">&#123;<\/span>\n    <span class=\"kw1\">private<\/span> Map<span class=\"sy0\">&lt;<\/span>String, Class<span class=\"sy0\">&lt;?&gt;&gt;<\/span> classes <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> HashMap<span class=\"sy0\">&lt;<\/span>String, Class<span class=\"sy0\">&lt;?&gt;&gt;<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n    GuiceFactoryInstance<span class=\"br0\">&#40;<\/span><span class=\"kw1\">final<\/span> GuiceFactory factory, <span class=\"kw1\">final<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky\"><span class=\"kw3\">String<\/span><\/a> id, <span class=\"kw1\">final<\/span> ConfigMap properties<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n      <span class=\"kw1\">super<\/span><span class=\"br0\">&#40;<\/span>factory, id, properties<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">&#125;<\/span>\n&nbsp;\n    @Override\n    <span class=\"kw1\">public<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Aobject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky\"><span class=\"kw3\">Object<\/span><\/a> lookup<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n      <span class=\"kw1\">final<\/span> Injector injector <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span>Injector<span class=\"br0\">&#41;<\/span>FlexContext.<span class=\"me1\">getServletContext<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">getAttribute<\/span><span class=\"br0\">&#40;<\/span>\n          GuiceServletContextListener.<span class=\"me1\">KEY<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n      injector.<span class=\"me1\">injectMembers<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n      <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky\"><span class=\"kw3\">String<\/span><\/a> className <span class=\"sy0\">=<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">getSource<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n      Class<span class=\"sy0\">&lt;?&gt;<\/span> clazz <span class=\"sy0\">=<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">classes<\/span>.<span class=\"me1\">get<\/span><span class=\"br0\">&#40;<\/span>className<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n      <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>clazz <span class=\"sy0\">==<\/span> <span class=\"kw2\">null<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n        <span class=\"kw1\">try<\/span> <span class=\"br0\">&#123;<\/span>\n          clazz <span class=\"sy0\">=<\/span> <span class=\"kw1\">Class<\/span>.<span class=\"me1\">forName<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">getSource<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n          <span class=\"kw1\">this<\/span>.<span class=\"me1\">classes<\/span>.<span class=\"me1\">put<\/span><span class=\"br0\">&#40;<\/span>className, clazz<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n        <span class=\"br0\">&#125;<\/span>\n        <span class=\"kw1\">catch<\/span> <span class=\"br0\">&#40;<\/span><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Aclassnotfoundexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky\"><span class=\"kw3\">ClassNotFoundException<\/span><\/a> ex<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n          ServiceException throwing <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> ServiceException<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n          throwing.<span class=\"me1\">setMessage<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;Could not find remote service class '&quot;<\/span> <span class=\"sy0\">+<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">getSource<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">+<\/span> <span class=\"st0\">&quot;'&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n          throwing.<span class=\"me1\">setRootCause<\/span><span class=\"br0\">&#40;<\/span>ex<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n          throwing.<span class=\"me1\">setCode<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;Server.Processing&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n          <span class=\"kw1\">throw<\/span> throwing<span class=\"sy0\">;<\/span>\n        <span class=\"br0\">&#125;<\/span>\n      <span class=\"br0\">&#125;<\/span>\n      <span class=\"kw1\">return<\/span> injector.<span class=\"me1\">getInstance<\/span><span class=\"br0\">&#40;<\/span>clazz<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">&#125;<\/span>\n&nbsp;\n    @Override\n    <span class=\"kw1\">public<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky\"><span class=\"kw3\">String<\/span><\/a> toString<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n      <span class=\"kw1\">return<\/span> <span class=\"st0\">&quot;Guice factory &lt;id='&quot;<\/span> <span class=\"sy0\">+<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">getId<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">+<\/span> <span class=\"st0\">&quot;',source='&quot;<\/span> <span class=\"sy0\">+<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">getSource<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">+<\/span>\n          <span class=\"st0\">&quot;',scope='&quot;<\/span> <span class=\"sy0\">+<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">getScope<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">+<\/span> <span class=\"st0\">&quot;'&gt;&quot;<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">&#125;<\/span>\n  <span class=\"br0\">&#125;<\/span>\n<span class=\"br0\">&#125;<\/span><\/pre><\/div><\/div>\n<h3>Create a context listener<\/h3>\n<p>The Guice servlet jar contains a ServletContextListener, but I haven&#8217;t taken the time to integrate it into this solution. \u00a0For simplicity, you can use this one, which works with the factory above.<\/p>\n<div id=\"wpshdo_2\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_2\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_2\"><\/a><a id=\"wpshat_2\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_2\"  onClick=\"javascript:wpsh_toggleBlock(2)\" title=\"Click to show\/hide code block\">Code block<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_2\" onClick=\"javascript:wpsh_code(2)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/connorgarvey.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_2\" onClick=\"javascript:wpsh_print(2)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/connorgarvey.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/connorgarvey.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/connorgarvey.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_2\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"java\" style=\"font-family:monospace;\"><span class=\"kw1\">package<\/span> <span class=\"co2\">com.connorgarvey.guiceblazeds.servlet<\/span><span class=\"sy0\">;<\/span>\n&nbsp;\n<span class=\"kw1\">import<\/span> <span class=\"co2\">java.util.List<\/span><span class=\"sy0\">;<\/span>\n<span class=\"kw1\">import<\/span> <span class=\"co2\">javax.servlet.ServletContext<\/span><span class=\"sy0\">;<\/span>\n<span class=\"kw1\">import<\/span> <span class=\"co2\">javax.servlet.ServletContextEvent<\/span><span class=\"sy0\">;<\/span>\n<span class=\"kw1\">import<\/span> <span class=\"co2\">javax.servlet.ServletContextListener<\/span><span class=\"sy0\">;<\/span>\n<span class=\"kw1\">import<\/span> <span class=\"co2\">com.google.inject.Guice<\/span><span class=\"sy0\">;<\/span>\n<span class=\"kw1\">import<\/span> <span class=\"co2\">com.google.inject.Injector<\/span><span class=\"sy0\">;<\/span>\n<span class=\"kw1\">import<\/span> <span class=\"co2\">com.google.inject.Module<\/span><span class=\"sy0\">;<\/span>\n&nbsp;\n<span class=\"co3\">\/**\n * Prepares Guice on application startup\n * @author Connor Garvey\n * @created May 27, 2009 8:37:26 AM\n * @version 1.0.0\n * @since 1.0.0\n *\/<\/span>\n<span class=\"kw1\">public<\/span> <span class=\"kw1\">abstract<\/span> <span class=\"kw1\">class<\/span> GuiceServletContextListener <span class=\"kw1\">implements<\/span> ServletContextListener <span class=\"br0\">&#123;<\/span>\n  <span class=\"co3\">\/**\n   * The key of the servlet context attribute holding the injector\n   *\/<\/span>\n  <span class=\"kw1\">public<\/span> <span class=\"kw1\">static<\/span> <span class=\"kw1\">final<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky\"><span class=\"kw3\">String<\/span><\/a> KEY <span class=\"sy0\">=<\/span> Injector.<span class=\"kw1\">class<\/span>.<span class=\"me1\">getName<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&nbsp;\n  <span class=\"co3\">\/**\n   * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)\n   *\/<\/span>\n  <span class=\"kw1\">public<\/span> <span class=\"kw4\">void<\/span> contextDestroyed<span class=\"br0\">&#40;<\/span><span class=\"kw1\">final<\/span> ServletContextEvent servletContextEvent<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n    servletContextEvent.<span class=\"me1\">getServletContext<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">removeAttribute<\/span><span class=\"br0\">&#40;<\/span>KEY<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n  <span class=\"br0\">&#125;<\/span>\n&nbsp;\n  <span class=\"co3\">\/**\n   * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)\n   *\/<\/span>\n  <span class=\"kw1\">public<\/span> <span class=\"kw4\">void<\/span> contextInitialized<span class=\"br0\">&#40;<\/span><span class=\"kw1\">final<\/span> ServletContextEvent servletContextEvent<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n    servletContextEvent.<span class=\"me1\">getServletContext<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">setAttribute<\/span><span class=\"br0\">&#40;<\/span>KEY,\n        <span class=\"kw1\">this<\/span>.<span class=\"me1\">getInjector<\/span><span class=\"br0\">&#40;<\/span>servletContextEvent.<span class=\"me1\">getServletContext<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n  <span class=\"br0\">&#125;<\/span>\n&nbsp;\n  <span class=\"kw1\">private<\/span> Injector getInjector<span class=\"br0\">&#40;<\/span><span class=\"kw1\">final<\/span> ServletContext servletContext<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n    <span class=\"kw1\">return<\/span> Guice.<span class=\"me1\">createInjector<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">getModules<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n  <span class=\"br0\">&#125;<\/span>\n&nbsp;\n  <span class=\"co3\">\/**\n   * Gets the modules used by the application\n   * @return the modules\n   *\/<\/span>\n  <span class=\"kw1\">protected<\/span> <span class=\"kw1\">abstract<\/span> List<span class=\"sy0\">&lt;?<\/span> <span class=\"kw1\">extends<\/span> Module<span class=\"sy0\">&gt;<\/span> getModules<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">&#125;<\/span><\/pre><\/div><\/div>\n<h3>Extend GuiceContextListener<\/h3>\n<p>Create a concret version of the class above. \u00a0It should return all modules needed for the application.<\/p>\n<h3>Modify web.xml<\/h3>\n<p>Now, prepare web.xml with the normal BlazeDS settings plus some extras for Guice.<\/p>\n<div id=\"wpshdo_3\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_3\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_3\"><\/a><a id=\"wpshat_3\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_3\"  onClick=\"javascript:wpsh_toggleBlock(3)\" title=\"Click to show\/hide code block\">Code block<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_3\" onClick=\"javascript:wpsh_code(3)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/connorgarvey.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_3\" onClick=\"javascript:wpsh_print(3)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/connorgarvey.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/connorgarvey.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/connorgarvey.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_3\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"xml\" style=\"font-family:monospace;\"><span class=\"sc3\"><span class=\"re1\">&lt;?xml<\/span> <span class=\"re0\">version<\/span>=<span class=\"st0\">&quot;1.0&quot;<\/span> <span class=\"re0\">encoding<\/span>=<span class=\"st0\">&quot;UTF-8&quot;<\/span><span class=\"re2\">?&gt;<\/span><\/span>\n<span class=\"sc0\">&lt;!DOCTYPE web-app PUBLIC &quot;-\/\/Sun Microsystems, Inc.\/\/DTD Web Application 2.3\/\/EN&quot; &quot;http:\/\/java.sun.com\/dtd\/web-app_2_3.dtd&quot;&gt;<\/span>\n<span class=\"sc3\"><span class=\"re1\">&lt;web-app<span class=\"re2\">&gt;<\/span><\/span><\/span>\n  <span class=\"sc3\"><span class=\"re1\">&lt;display-name<span class=\"re2\">&gt;<\/span><\/span><\/span>Guice BlazeDS<span class=\"sc3\"><span class=\"re1\">&lt;\/display-name<span class=\"re2\">&gt;<\/span><\/span><\/span>\n  <span class=\"sc3\"><span class=\"re1\">&lt;description<span class=\"re2\">&gt;<\/span><\/span><\/span>Guice BlazeDS<span class=\"sc3\"><span class=\"re1\">&lt;\/description<span class=\"re2\">&gt;<\/span><\/span><\/span>\n  <span class=\"sc3\"><span class=\"re1\">&lt;listener<span class=\"re2\">&gt;<\/span><\/span><\/span>\n    <span class=\"sc3\"><span class=\"re1\">&lt;listener-class<span class=\"re2\">&gt;<\/span><\/span><\/span>flex.messaging.HttpFlexSession<span class=\"sc3\"><span class=\"re1\">&lt;\/listener-class<span class=\"re2\">&gt;<\/span><\/span><\/span>\n  <span class=\"sc3\"><span class=\"re1\">&lt;\/listener<span class=\"re2\">&gt;<\/span><\/span><\/span>\n  <span class=\"sc3\"><span class=\"re1\">&lt;listener<span class=\"re2\">&gt;<\/span><\/span><\/span>\n    <span class=\"sc3\"><span class=\"re1\">&lt;listener-class<span class=\"re2\">&gt;<\/span><\/span><\/span>com.connorgarvey.guiceblazeds.servlet.MyCustomGuiceServletContextListener<span class=\"sc3\"><span class=\"re1\">&lt;\/listener-class<span class=\"re2\">&gt;<\/span><\/span><\/span>\n  <span class=\"sc3\"><span class=\"re1\">&lt;\/listener<span class=\"re2\">&gt;<\/span><\/span><\/span>\n  <span class=\"sc3\"><span class=\"re1\">&lt;servlet<span class=\"re2\">&gt;<\/span><\/span><\/span>\n    <span class=\"sc3\"><span class=\"re1\">&lt;servlet-name<span class=\"re2\">&gt;<\/span><\/span><\/span>MessageBrokerServlet<span class=\"sc3\"><span class=\"re1\">&lt;\/servlet-name<span class=\"re2\">&gt;<\/span><\/span><\/span>\n    <span class=\"sc3\"><span class=\"re1\">&lt;display-name<span class=\"re2\">&gt;<\/span><\/span><\/span>MessageBrokerServlet<span class=\"sc3\"><span class=\"re1\">&lt;\/display-name<span class=\"re2\">&gt;<\/span><\/span><\/span>\n    <span class=\"sc3\"><span class=\"re1\">&lt;servlet-class<span class=\"re2\">&gt;<\/span><\/span><\/span>flex.messaging.MessageBrokerServlet<span class=\"sc3\"><span class=\"re1\">&lt;\/servlet-class<span class=\"re2\">&gt;<\/span><\/span><\/span>\n    <span class=\"sc3\"><span class=\"re1\">&lt;init-param<span class=\"re2\">&gt;<\/span><\/span><\/span>\n      <span class=\"sc3\"><span class=\"re1\">&lt;param-name<span class=\"re2\">&gt;<\/span><\/span><\/span>services.configuration.file<span class=\"sc3\"><span class=\"re1\">&lt;\/param-name<span class=\"re2\">&gt;<\/span><\/span><\/span>\n      <span class=\"sc3\"><span class=\"re1\">&lt;param-value<span class=\"re2\">&gt;<\/span><\/span><\/span>\/WEB-INF\/config\/flex\/services-config.xml<span class=\"sc3\"><span class=\"re1\">&lt;\/param-value<span class=\"re2\">&gt;<\/span><\/span><\/span>\n    <span class=\"sc3\"><span class=\"re1\">&lt;\/init-param<span class=\"re2\">&gt;<\/span><\/span><\/span>\n    <span class=\"sc3\"><span class=\"re1\">&lt;load-on-startup<span class=\"re2\">&gt;<\/span><\/span><\/span>1<span class=\"sc3\"><span class=\"re1\">&lt;\/load-on-startup<span class=\"re2\">&gt;<\/span><\/span><\/span>\n  <span class=\"sc3\"><span class=\"re1\">&lt;\/servlet<span class=\"re2\">&gt;<\/span><\/span><\/span>\n  <span class=\"sc3\"><span class=\"re1\">&lt;servlet-mapping<span class=\"re2\">&gt;<\/span><\/span><\/span>\n    <span class=\"sc3\"><span class=\"re1\">&lt;servlet-name<span class=\"re2\">&gt;<\/span><\/span><\/span>MessageBrokerServlet<span class=\"sc3\"><span class=\"re1\">&lt;\/servlet-name<span class=\"re2\">&gt;<\/span><\/span><\/span>\n    <span class=\"sc3\"><span class=\"re1\">&lt;url-pattern<span class=\"re2\">&gt;<\/span><\/span><\/span>\/messagebroker\/*<span class=\"sc3\"><span class=\"re1\">&lt;\/url-pattern<span class=\"re2\">&gt;<\/span><\/span><\/span>\n  <span class=\"sc3\"><span class=\"re1\">&lt;\/servlet-mapping<span class=\"re2\">&gt;<\/span><\/span><\/span>\n  <span class=\"sc3\"><span class=\"re1\">&lt;welcome-file-list<span class=\"re2\">&gt;<\/span><\/span><\/span>\n    <span class=\"sc3\"><span class=\"re1\">&lt;welcome-file<span class=\"re2\">&gt;<\/span><\/span><\/span>index.html<span class=\"sc3\"><span class=\"re1\">&lt;\/welcome-file<span class=\"re2\">&gt;<\/span><\/span><\/span>\n    <span class=\"sc3\"><span class=\"re1\">&lt;welcome-file<span class=\"re2\">&gt;<\/span><\/span><\/span>index.htm<span class=\"sc3\"><span class=\"re1\">&lt;\/welcome-file<span class=\"re2\">&gt;<\/span><\/span><\/span>\n  <span class=\"sc3\"><span class=\"re1\">&lt;\/welcome-file-list<span class=\"re2\">&gt;<\/span><\/span><\/span>\n<span class=\"sc3\"><span class=\"re1\">&lt;\/web-app<span class=\"re2\">&gt;<\/span><\/span><\/span><\/pre><\/div><\/div>\n<p>This way, BlazeDS will start at server startup, followed by Guice.<\/p>\n<h3>Modify BlazeDS config<\/h3>\n<p>Open services-config.xml and add this at the top of the file. \u00a0Point it to the Guice factory.<\/p>\n<div id=\"wpshdo_4\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_4\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_4\"><\/a><a id=\"wpshat_4\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_4\"  onClick=\"javascript:wpsh_toggleBlock(4)\" title=\"Click to show\/hide code block\">Code block<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_4\" onClick=\"javascript:wpsh_code(4)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/connorgarvey.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_4\" onClick=\"javascript:wpsh_print(4)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/connorgarvey.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/connorgarvey.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/connorgarvey.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_4\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"xml\" style=\"font-family:monospace;\"><span class=\"sc3\"><span class=\"re1\">&lt;?xml<\/span> <span class=\"re0\">version<\/span>=<span class=\"st0\">&quot;1.0&quot;<\/span> <span class=\"re0\">encoding<\/span>=<span class=\"st0\">&quot;UTF-8&quot;<\/span><span class=\"re2\">?&gt;<\/span><\/span>\n<span class=\"sc3\"><span class=\"re1\">&lt;services-config<span class=\"re2\">&gt;<\/span><\/span><\/span>\n  <span class=\"sc3\"><span class=\"re1\">&lt;factories<span class=\"re2\">&gt;<\/span><\/span><\/span>\n    <span class=\"sc3\"><span class=\"re1\">&lt;factory<\/span> <span class=\"re0\">id<\/span>=<span class=\"st0\">&quot;guice&quot;<\/span> <span class=\"re0\">class<\/span>=<span class=\"st0\">&quot;com.connorgarvey.guiceblazeds.servlet.GuiceFactory&quot;<\/span> <span class=\"re2\">\/&gt;<\/span><\/span>\n  <span class=\"sc3\"><span class=\"re1\">&lt;\/factories<span class=\"re2\">&gt;<\/span><\/span><\/span><\/pre><\/div><\/div>\n<h3>Set the factory of all remoting destinations<\/h3>\n<p>In remoting-config.xml, be sure to set the factory of all destinations to the name specified in services-config.xml above.<\/p>\n<pre>&lt;destination id=\"SomeService\"&gt;\r\n  &lt;properties&gt;\r\n    &lt;factory&gt;guice&lt;\/factory&gt;\r\n    &lt;source&gt;com.connorgarvey.guiceblazeds.service.flex.SomeFlexService&lt;\/source&gt;\r\n  &lt;\/properties&gt;\r\n&lt;\/destination&gt;<\/pre>\n<h3>How this all works<\/h3>\n<ol>\n<li>When the server starts, BlazeDS and Guice are initialized by the servlet listeners.<\/li>\n<li>When BlazeDS receives a request, to a service, it&#8217;ll see that it&#8217;s supposed to retrieve it from the &#8220;guice&#8221; factory.<\/li>\n<li>The Guice factory will return an instance of the class specified in the source of the service configuration from Guice to BlazeDS for use in completing the request.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>I just finished putting a server together that uses Google&#8217;s Guice and Adobe&#8217;s BlazeDS.\u00a0 Here&#8217;s how you can quickly get a project working using the same configuration. * Update: A new post describes using Guice&#8217;s ServletModule to configure the MessageBrokerServlet. Download the libraries Download Guice and BlazeDS.\u00a0 Use the project configured in the BlazeDS war [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[26],"tags":[32,30,31,62,24,4,7,16],"class_list":["post-132","post","type-post","status-publish","format-standard","hentry","category-guice","tag-adobe","tag-blazeds","tag-google","tag-guice","tag-injection","tag-java","tag-redpoint","tag-source"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p1ql2n-28","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/connorgarvey.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/132","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/connorgarvey.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/connorgarvey.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/connorgarvey.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/connorgarvey.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=132"}],"version-history":[{"count":9,"href":"https:\/\/connorgarvey.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/132\/revisions"}],"predecessor-version":[{"id":165,"href":"https:\/\/connorgarvey.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/132\/revisions\/165"}],"wp:attachment":[{"href":"https:\/\/connorgarvey.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=132"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/connorgarvey.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=132"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/connorgarvey.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=132"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}