Skip to content

Commit

Permalink
SEAMREST-47
Browse files Browse the repository at this point in the history
  • Loading branch information
jharting committed Aug 10, 2011
1 parent 68a7143 commit f6d5ddc
Show file tree
Hide file tree
Showing 7 changed files with 196 additions and 13 deletions.
26 changes: 26 additions & 0 deletions docs/reference/src/main/docbook/en-US/rest-installation.xml
Expand Up @@ -106,4 +106,30 @@ public class MyApplication extends Application
}
}]]></programlisting>
</sect1>

<sect1>
<title>Servlet container support</title>

<para>
Seam REST can be used with plain Servlet containers such as Apache Tomcat 7. Firstly, we need to enhance the
Servlet container
capabilities. This is done by bundling Weld and RESTEasy within the application and configuring
them. See the
jaxrs-exceptions example and its <literal>tomcat</literal> build profile for more details.
</para>

<para>
In a EE6-compliant environment, Seam REST would be bootstrapped by a Servlet listener. However,
<literal>weld-servlet</literal>
does not support CDI injection into Servlet listeners. Therefore, add the following line to your application's
<filename>web.xml</filename>
file to bootstrap Seam REST using Servlet.
</para>

<programlisting role="XML"><![CDATA[<servlet>
<display-name>Servlet REST Listener Startup</display-name>
<servlet-class>org.jboss.seam.rest.SeamRestStartupListener</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>]]></programlisting>
</sect1>
</chapter>
51 changes: 50 additions & 1 deletion examples/exceptions/pom.xml
@@ -1,5 +1,6 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
Expand Down Expand Up @@ -122,6 +123,54 @@
</plugins>
</build>
</profile>
<profile>
<id>tomcat</id>
<dependencies>
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
<version>1.1.2.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>jaxrs-api</artifactId>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-cdi</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<directory>src/main/tomcat</directory>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>

5 changes: 5 additions & 0 deletions examples/exceptions/readme.txt
Expand Up @@ -19,6 +19,11 @@ mvn clean package
$GF_HOME/bin/asadmin start-domain
$GF_HOME/bin/asadmin deploy target/rest-exceptions.war

Deploying to Tomcat 7
======================
mvn clean package -Ptomcat
deploy the generated archive

Running tests
======================
Deploy the application
Expand Down
45 changes: 45 additions & 0 deletions examples/exceptions/src/main/tomcat/WEB-INF/web.xml
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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_3_0.xsd">

<!-- RESTEasy Filter -->
<filter>
<filter-name>Resteasy</filter-name>
<filter-class>org.jboss.resteasy.plugins.server.servlet.FilterDispatcher</filter-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>org.jboss.seam.rest.examples.exceptions.JaxrsExceptionsApplication</param-value>
</init-param>
<init-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/api</param-value>
</init-param>
<init-param>
<param-name>resteasy.injector.factory</param-name>
<param-value>org.jboss.resteasy.cdi.CdiInjectorFactory</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>Resteasy</filter-name>
<url-pattern>/api/*</url-pattern>
</filter-mapping>

<!-- Weld Servlet Listener -->
<listener>
<listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>

<!-- Seam Servlet Bootstrap -->
<!-- We need to Bootstrap using Servlet since weld-servlet does not support injection into Servlet Listeners -->
<servlet>
<display-name>Servlet REST Listener Startup</display-name>
<servlet-class>org.jboss.seam.rest.SeamRestStartupListener</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>

6 changes: 6 additions & 0 deletions examples/exceptions/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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_3_0.xsd">

</web-app>

28 changes: 16 additions & 12 deletions impl/src/main/java/org/jboss/seam/rest/SeamRestStartup.java
@@ -1,11 +1,9 @@
package org.jboss.seam.rest;

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import org.jboss.logging.Logger;
import org.jboss.seam.rest.client.RestClientExtension;
Expand All @@ -20,9 +18,11 @@
*
* @author <a href="mailto:jharting@redhat.com">Jozef Hartinger</a>
*/
@WebListener
public class SeamRestStartup implements ServletContextListener {
@ApplicationScoped
public class SeamRestStartup {

private static final Logger log = Logger.getLogger(SeamRestStartup.class);

@Inject
private RestClientExtension restClientExtension;
@Inject
Expand All @@ -35,20 +35,24 @@ public class SeamRestStartup implements ServletContextListener {
@Inject
@RestResource
private Event<ServletContext> event;

private boolean initialized = false;

@Override
public void contextInitialized(ServletContextEvent sce) {
event.fire(sce.getServletContext());
public synchronized void init(ServletContext sc)
{
if (initialized)
{
return;
}

event.fire(sc);

log.infov(
"Seam REST {0} (Client integration: {1}, Catch integration: {2}, {3} exception mapping rules, Templating provider: {4})",
this.getClass().getPackage().getSpecificationVersion(),
restClientExtension.isClientIntegrationEnabled() ? "enabled" : "disabled", exceptionMappingExtension
.isCatchIntegrationEnabled() ? "enabled" : "disabled", exceptionMapper.getMappings().size(), templating
.getProvider() == null ? "null" : templating.getProvider().toString());
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
initialized = true;
}
}
@@ -0,0 +1,48 @@
package org.jboss.seam.rest;

import javax.inject.Inject;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServlet;

import org.jboss.logging.Logger;

/**
* We also extend HttpServlet so that Seam REST can be bootstrapped by eagerly-loaded Servlet on Tomcat 7, where
* weld-servlet does not support CDI injection into Servlet Listeners.
*
* @author <a href="http://community.jboss.org/people/jharting">Jozef Hartinger</a>
*
*/
@WebListener
public class SeamRestStartupListener extends HttpServlet implements ServletContextListener {

private static final Logger log = Logger.getLogger(SeamRestStartupListener.class);

private static final long serialVersionUID = -3618026329655575903L;

@Inject
private SeamRestStartup startup;

@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
startup.init(config.getServletContext());
}

@Override
public void contextInitialized(ServletContextEvent sce) {
if (startup == null) {
log.warn("Listener injection does not work. You are probably running within a Servlet container. Make sure to configure Seam REST to use Servlet bootstrap instead.");
return;
}
startup.init(sce.getServletContext());
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}

0 comments on commit f6d5ddc

Please sign in to comment.