Uploaded image for project: 'WildFly'
  1. WildFly
  2. WFLY-4205

Undertow not detecting @HandlesTypes If the implentation class is inside EAR/lib

    XMLWordPrintable

Details

    Description

      Hi,
      I have spring mvc enabled web apps (20+ web apps) packaged as an EAR deployment. All my spring mvc related jar's are in my EAR/lib, i'm using SpringServletContainerInitializer (implementation of ServletContainerInitializer ) code as follows

      @HandlesTypes(WebApplicationInitializer.class)
      public class SpringServletContainerInitializer implements ServletContainerInitializer {
      
      	@Override
      	public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)
      			throws ServletException {
      
      		List<WebApplicationInitializer> initializers = new LinkedList<WebApplicationInitializer>();
      
      		if (webAppInitializerClasses != null) {
      			for (Class<?> waiClass : webAppInitializerClasses) {
      				// Be defensive: Some servlet containers provide us with invalid classes,
      				// no matter what @HandlesTypes says...
      				if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) &&
      						WebApplicationInitializer.class.isAssignableFrom(waiClass)) {
      					try {
      						initializers.add((WebApplicationInitializer) waiClass.newInstance());
      					}
      					catch (Throwable ex) {
      						throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex);
      					}
      				}
      			}
      		}
      
      		if (initializers.isEmpty()) {
      			servletContext.log("No Spring WebApplicationInitializer types detected on classpath");
      			return;
      		}
      
      		AnnotationAwareOrderComparator.sort(initializers);
      		servletContext.log("Spring WebApplicationInitializers detected on classpath: " + initializers);
      
      		for (WebApplicationInitializer initializer : initializers) {
      			initializer.onStartup(servletContext);
      		}
      	}
      
      }
      
      

      But the @HandlesTypes(WebApplicationInitializer.class) are not getting detected from the EAR/lib

      Even i have tried adding the extracted the SPI from spring-web jar and added inside my war's WEB-INF/lib as a jar
      WEB-INF/lib/web-init-spi.jar which contains
      META-INF/services/javax.servlet.ServletContainerIntializer file with org.springframework.web.SpringServletContainerInitializer as an entry. This time its detecting SpringServletContainerInitializer but not detecting what defined in @HandlesTypes

      Its only working If i package all those spring mvc jars inside WEB-INF/lib then everything started working.

      I have no idea this is how the servlet specification works or its a wildfly issue but i see it as a problem for those who depends on Wildfly or similar EE Servers with an EAR deployment structure.

      Attachments

        Activity

          People

            sdouglas1@redhat.com Stuart Douglas
            sreekanth.nair Sreekanth Nair (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: