Using @SpringBean beyond Wicket
Sometimes a web application also contains some non-Wicket stuff. For example you might use Restlets. You can still use the @SpringBean annotation in that code. The only prerequisite is that the Wicket application instance is set in a thread local variable. Use the filter given below to accomplish this. Make sure that in web.xml
the filter is configured /after/ the Wicket filter. This approach does not work in combination with the Wicket-servlet.
Example web.xml fragment:
<filter> <filter-name>wicket.filter</filter-name> <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class> <init-param> <param-name>applicationFactoryClassName</param-name> <param-value>org.apache.wicket.spring.SpringWebApplicationFactory</param-value> </init-param> </filter> <filter> <filter-name>wicket.application.filter</filter-name> <filter-class>com.tipspot.site.util.WicketApplicationFilter</filter-class> <init-param> <param-name>wicketFilterName</param-name> <param-value>wicket.filter</param-value> </init-param> </filter> <filter-mapping> <filter-name>wicket.filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>wicket.application.filter</filter-name> <url-pattern>/rest/*</url-pattern> </filter-mapping>
Here is the filter:
package com.example.wicket.filter; import org.apache.wicket.Application; import org.apache.wicket.protocol.http.WebApplication; import javax.servlet.*; import java.io.IOException; /** * Filter that sets the wicket application, just like {@link org.apache.wicket.protocol.http.WicketFilter} * would do. * * <p>This implementation assumes that it is placed in a filter chain, <i>after</i> WicketFilter, * for URLs that are not handled by the WicketFilter. * * <p>The filter name of the wicket filter is retrieved from the init parameter wicketFilterName. * * @author Erik van Oosten */ public class WicketApplicationFilter implements Filter { private WebApplication webApplication; public void init(FilterConfig filterConfig) throws ServletException { // Get instance of the Wicket application, it is set by the Wicket filter. String contextKey = "wicket:" + filterConfig.getInitParameter("wicketFilterName"); webApplication = (WebApplication) filterConfig.getServletContext().getAttribute(contextKey); if (webApplication == null) { throw new ServletException("Could not find the Wicket application, please make " + "sure filter WicketApplicationFilter is embedded in Wicket's filter"); } } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { try { // Set the webapplication for this thread Application.set(webApplication); chain.doFilter(request, response); } finally { // always unset the application thread local Application.unset(); } } public void destroy() { webApplication = null; } }