Spring Java Config vs Jboss 7

我试图在jboss上运行一个基于spring java的配置的简单应用程序,但没有成功。 这个应用程序在jetty和tomcat上都可以正常工作。 jboss日志看起来不错,因为它向我展示了一些成功的映射等,但我得到404试图访问该URL。

这是我的代码:

初始化

@Order(1) public class Initializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class[] getRootConfigClasses() { return new Class[] {RootConfig.class}; } @Override protected Class[] getServletConfigClasses() { return new Class[] {WebAppConfig.class}; } @Override protected String[] getServletMappings() { return new String[] {"/"}; } @Override protected void customizeRegistration(ServletRegistration.Dynamic registration) { registration.setInitParameter("dispatchOptionsRequest", "true"); } } 

RootConfig

 @Configuration @ComponentScan(value = "com.test.config", excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, value = RootConfig.class)) public class RootConfig { } 

WebAppConfig

 @Configuration @ComponentScan("com.test") @EnableWebMvc @EnableSpringDataWebSupport public class WebAppConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); } @Bean public InternalResourceViewResolver setupViewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/pages/"); resolver.setSuffix(".jsp"); return resolver; } @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("index"); } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } } 

现在jboss日志……

 17:08:53,645 INFO [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/test]] (MSC service thread 1-8) Spring WebApplicationInitializers detected on classpath: [br.com.cleartech.config.Initializer@2f7e4dd2] 17:08:53,767 INFO [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/test]] (MSC service thread 1-8) Initializing Spring root WebApplicationContext 17:08:53,768 INFO [org.springframework.web.context.ContextLoader] (MSC service thread 1-8) Root WebApplicationContext: initialization started 17:08:53,770 INFO [org.springframework.web.context.support.AnnotationConfigWebApplicationContext] (MSC service thread 1-8) Refreshing Root WebApplicationContext: startup date [Wed Dec 18 17:08:53 BRST 2013]; root of context hierarchy 17:08:53,843 INFO [org.springframework.context.annotation.ClassPathBeanDefinitionScanner] (MSC service thread 1-8) JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning 17:08:53,846 INFO [org.springframework.context.annotation.ClassPathBeanDefinitionScanner] (MSC service thread 1-8) JSR-330 'javax.inject.Named' annotation found and supported for component scanning 17:08:53,847 INFO [org.springframework.web.context.support.AnnotationConfigWebApplicationContext] (MSC service thread 1-8) Registering annotated classes: [class br.com.cleartech.config.RootConfig] 17:08:53,915 INFO [org.springframework.context.annotation.ClassPathBeanDefinitionScanner] (MSC service thread 1-8) JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning 17:08:53,916 INFO [org.springframework.context.annotation.ClassPathBeanDefinitionScanner] (MSC service thread 1-8) JSR-330 'javax.inject.Named' annotation found and supported for component scanning 17:08:53,977 INFO [org.springframework.context.annotation.ClassPathBeanDefinitionScanner] (MSC service thread 1-8) JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning 17:08:53,978 INFO [org.springframework.context.annotation.ClassPathBeanDefinitionScanner] (MSC service thread 1-8) JSR-330 'javax.inject.Named' annotation found and supported for component scanning 17:08:54,130 INFO [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] (MSC service thread 1-8) JSR-330 'javax.inject.Inject' annotation found and supported for autowiring 17:08:54,153 INFO [org.springframework.beans.factory.support.DefaultListableBeanFactory] (MSC service thread 1-8) Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@52477602: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,rootConfig,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,log4j,webAppConfig,homeController,consoleAppender,fileAppender,registerSpringLogger,org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration,mvcValidator,simpleControllerHandlerAdapter,beanNameHandlerMapping,httpRequestHandlerAdapter,mvcContentNegotiationManager,requestMappingHandlerMapping,resourceHandlerMapping,requestMappingHandlerAdapter,mvcConversionService,viewControllerHandlerMapping,defaultServletHandlerMapping,handlerExceptionResolver,org.springframework.data.web.config.SpringDataWebConfiguration,pageableResolver,sortResolver,setupViewResolver]; root of factory hierarchy 17:08:54,269 INFO [org.hibernate.validator.util.Version] (MSC service thread 1-8) Hibernate Validator 4.2.0.Final 17:08:54,388 INFO [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (MSC service thread 1-8) Mapped "{[/teste],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String br.com.cleartech.controller.HomeController.teste() 17:08:54,404 INFO [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] (MSC service thread 1-8) Mapped URL path [/resources/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 17:08:54,631 INFO [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] (MSC service thread 1-8) Root mapping to handler of type [class org.springframework.web.servlet.mvc.ParameterizableViewController] 17:08:54,634 INFO [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] (MSC service thread 1-8) Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler] 17:08:54,668 INFO [org.springframework.web.context.ContextLoader] (MSC service thread 1-8) Root WebApplicationContext: initialization completed in 899 ms 17:08:54,675 INFO [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/test]] (MSC service thread 1-8) Initializing Spring FrameworkServlet 'dispatcher' 17:08:54,676 INFO [org.springframework.web.servlet.DispatcherServlet] (MSC service thread 1-8) FrameworkServlet 'dispatcher': initialization started 17:08:54,679 INFO [org.springframework.web.context.support.AnnotationConfigWebApplicationContext] (MSC service thread 1-8) Refreshing WebApplicationContext for namespace 'dispatcher-servlet': startup date [Wed Dec 18 17:08:54 BRST 2013]; parent: Root WebApplicationContext 17:08:54,681 INFO [org.springframework.context.annotation.ClassPathBeanDefinitionScanner] (MSC service thread 1-8) JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning 17:08:54,682 INFO [org.springframework.context.annotation.ClassPathBeanDefinitionScanner] (MSC service thread 1-8) JSR-330 'javax.inject.Named' annotation found and supported for component scanning 17:08:54,683 INFO [org.springframework.web.context.support.AnnotationConfigWebApplicationContext] (MSC service thread 1-8) Registering annotated classes: [class br.com.cleartech.config.WebAppConfig] 17:08:54,685 INFO [org.springframework.context.annotation.ClassPathBeanDefinitionScanner] (MSC service thread 1-8) JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning 17:08:54,686 INFO [org.springframework.context.annotation.ClassPathBeanDefinitionScanner] (MSC service thread 1-8) JSR-330 'javax.inject.Named' annotation found and supported for component scanning 17:08:54,698 INFO [org.springframework.context.annotation.ClassPathBeanDefinitionScanner] (MSC service thread 1-8) JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning 17:08:54,699 INFO [org.springframework.context.annotation.ClassPathBeanDefinitionScanner] (MSC service thread 1-8) JSR-330 'javax.inject.Named' annotation found and supported for component scanning 17:08:54,759 INFO [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] (MSC service thread 1-8) JSR-330 'javax.inject.Inject' annotation found and supported for autowiring 17:08:54,786 INFO [org.springframework.beans.factory.support.DefaultListableBeanFactory] (MSC service thread 1-8) Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@12f882f3: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,webAppConfig,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,log4j,rootConfig,homeController,consoleAppender,fileAppender,registerSpringLogger,org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration,mvcValidator,simpleControllerHandlerAdapter,beanNameHandlerMapping,httpRequestHandlerAdapter,mvcContentNegotiationManager,requestMappingHandlerMapping,resourceHandlerMapping,requestMappingHandlerAdapter,mvcConversionService,viewControllerHandlerMapping,defaultServletHandlerMapping,handlerExceptionResolver,org.springframework.data.web.config.SpringDataWebConfiguration,pageableResolver,sortResolver,setupViewResolver]; parent: org.springframework.beans.factory.support.DefaultListableBeanFactory@52477602 17:08:54,885 INFO [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (MSC service thread 1-8) Mapped "{[/teste],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String br.com.cleartech.controller.HomeController.teste() 17:08:54,891 INFO [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] (MSC service thread 1-8) Mapped URL path [/resources/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 17:08:54,927 INFO [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] (MSC service thread 1-8) Root mapping to handler of type [class org.springframework.web.servlet.mvc.ParameterizableViewController] 17:08:54,931 INFO [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] (MSC service thread 1-8) Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler] 17:08:54,962 INFO [org.springframework.web.servlet.DispatcherServlet] (MSC service thread 1-8) FrameworkServlet 'dispatcher': initialization completed in 285 ms 17:08:54,977 INFO [org.jboss.web] (MSC service thread 1-8) JBAS018210: Registering web context: /test 17:08:54,985 INFO [org.jboss.as] (MSC service thread 1-5) JBAS015951: Admin console listening on http://127.0.0.1:9990 17:08:54,986 INFO [org.jboss.as] (MSC service thread 1-5) JBAS015874: JBoss AS 7.1.1.Final "Brontes" started in 8333ms - Started 377 of 455 services (77 services are passive or on-demand) 17:08:55,175 INFO [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS018559: Deployed "test.war" 

正如你所看到的,它似乎没问题,因为我得到了一些:

 Spring WebApplicationInitializers detected on classpath Initializing Spring root WebApplicationContext Root WebApplicationContext: initialization started Mapped URL path [/resources/**] Mapped URL path [/**] Registering web context: /test JBAS018559: Deployed "test.war" 

但是当试图访问localhost:8080 / test或者甚至简单的rest声明到控制器时我得到了404。

在此先感谢蒂亚戈

部署到JBoss 7.1的Spring MVC项目没有web.xml,我遇到了类似的问题。

根据用于WebApplicationInitializer的Spring javadocs,旧版本的Tomcat(<= 7.0.14)无法以编程方式映射到“/”。 旧版本的JBoss AS 7也存在同样的缺陷。

这是我的问题的根源。 我通过“/”注册servlet,但JBoss EAP 6.4不支持编程方式。 它只能通过web.xml工作。 我仍然想使用程序化配置,所以我将映射更改为“/ *”而不是“/”,它解决了我的问题。

 public class WebApplicationInitializerImpl implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) throws ServletException { WebApplicationContext context = getContext(); Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(context)); registration.setLoadOnStartup(1); registration.addMapping("/*"); } private WebApplicationContext getContext() { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.setConfigLocation(AppConfig.class.getName()); return context; } } 

注意:此配置与JSP视图不兼容。 “/ *”将取代servlet容器的JSP Servlet。 如果您仍然依赖JSP视图,我建议使用web.xml来配置DispatcherServlet, 而不是以编程方式进行; web.xml配置正确使用“/”。

  dispatcher org.springframework.web.servlet.DispatcherServlet 1  contextConfigLocation     dispatcher /  

我正在使用@SpringBootApplication

当我在这个post中读到时,我需要:

将DispatcherServlet的映射更改为“/ *”而不是“/”(通过添加ServletRegistrationBean类型的@Bean和名为“dispatcherServlet”的servlet)

在这个URL中我找到了代码解决方案: 将Servlet Mapping添加到dispatch servlet

 @SpringBootApplication public class Application extends SpringBootServletInitializer { @Bean public DispatcherServlet dispatcherServlet() { return new DispatcherServlet(); } /** * Register dispatcherServlet programmatically * * @return ServletRegistrationBean */ @Bean public ServletRegistrationBean dispatcherServletRegistration() { ServletRegistrationBean registration = new ServletRegistrationBean( dispatcherServlet(), "/*"); registration .setName(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME); return registration; } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 

我们在JBoss EAP 6.2上有一个spring-boot(1.1.4)项目(我的客户的要求……)

我找到了一个在JBoss EAP 6.2.0 GA上运行它的解决方案,并保持在Apache Tomcat 7容器上运行的能力。

最初我的项目以嵌入模式运行,因此我需要创建和更改一些文件以在容器上运行。

要以root应用程序在Tomcat上运行,我创建了context.xml: /src/main/webapp/META-INF/context.xml

   

要以root应用程序在JBOSS EAP 6.2.0 GA上运行,我创建了jboss-web.xml: /src/main/webapp/WEB-INF/jboss-web.xml

   /  

我创建了一个类, 因为JBoss servlet映射用作/ *但不用于/

 import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration.Dynamic; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.web.SpringBootServletInitializer; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; /** * Working without web.xml with container (not em,bedded mode). * JBOSS EAP 6.2 specific: you need to map dispatcherServlet to /* . */ public class ContainerWebXml extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(TomcatStart.class); } /** * JBOSS EAP 6.2 mapping. * * @param container * @throws ServletException */ @Override public void onStartup(ServletContext container) throws ServletException { WebApplicationContext context = getContext(); Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(context)); registration.setLoadOnStartup(1); registration.addMapping("/*"); // required JBOSS EAP 6.2.0 GA super.onStartup(container); } private WebApplicationContext getContext() { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.setConfigLocation(TomcatStart.class.getName()); return context; } } 

不要忘记调用super.onStartup(容器);

pom.xml中的更改

   org.springframework.boot spring-boot-starter-tomcat provided  

如果你使用spring.profile,那么你需要设置为env。 变量。

我将JBoss EAP 6.2.0 GA作为独立模式运行:

 export JAVA_OPTS="-Dspring.profiles.active=local" .../jboss-eap-6.2/bin/standalone.sh 

如果您在Tomcat上运行 ,那么不要忘记设置-Dspring.profiles.active = local

正如我所看到的,当你在容器上运行时,将忽略server.port设置。

我正在使用Spring Boot 1.3.1和JBoss EAP 6.4。 我在你的项目中找到了你可以添加到src / main / resources / application.properties这一行:

 server.servlet-path=/* 

此外,如果您从Eclipse中启动它,请务必清理您的项目……由于这一点,我耗费了大量时间。

根据Michael R和IstvánPató提供的答案,JBoss中的servlet映射必须是“/ *”,而不是“/”。 但是,其他解决方案会导致@Component注释对象被实例化两次。 下面通过首先调用super.onStartup然后为调度程序servlet添加另一个映射来解决双重初始化:

 public class WebApplicationInitializerImpl implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) throws ServletException { super.onStartup(container); Dynamic registration = (Dynamic) container.getServletRegistration(EmbeddedWebApplicationContext.DISPATCHER_SERVLET_NAME); registration.setLoadOnStartup(1); registration.addMapping("/*"); } } 

我正在使用JBoss EAP 6.4。 我正在经历这个主题。

我想在将dispatchServlet的映射从“/”更改为“/ *”后添加。 项目中的JSP可能无法正确处理。 我怀疑因为“/ *”比“/*.jsp”具有更多的优先级,因此,JSPServlet可能没有获得处理JSP的请求,并且JSP将无法正确处理。 就我而言,JSP的源代码将作为文本出现在浏览器中。

我已经通过在web.xml中将JSP定义为servlet来解决了这个问题,如下所述。 之后事情对我来说很好:)

  index.jsp   LoginServlet /login.jsp   IndexServlet /index.jsp    LoginServlet /login.jsp   IndexServlet /index.jsp  

我花了很多时间在这上面,可能会帮助别人:))

好吧,对于遇到这个问题的其他人来说,它只适用于新的Wildfly。 如果你没有任何特定的容器来运行你的应用程序,你可以在jboss 7和wildfly之间进行选择并且想要运行spring java config,在wildfly上试试吧!

我遇到了与JBoss 6.4.0类似的问题。 和Spring Boot 1.3结合使用Tiles 3.安装Jboss补丁jboss-eap-6.4.6-patch.zip之后问题就解决了。

修补后我不需要使用设置server.servlet-path = / *