无法将Spring App部署到Websphere

时间:2014-02-11 22:37:55

标签: spring websphere

我在开发阶段一直在为tomcat开发一个应用程序。随着我们前进,我的客户希望部署到websphere。我试图在websphere 8.5上这样做,但由于某种原因,我似乎遇到了问题。 Tomcat很容易,我只是在战争中堕落,一切都像它应该的那样。 Websphere是一个不同的故事。当我尝试点击我的应用程序时,我不断收到以下错误:

Error 404: SRVE0190E: File not found: {0}

我一直在做一些研究,除了下面的一行之外,我没有注意到日志中有什么奇怪的东西。管理控制台说应用程序运行没有问题。

SRVE0292I: Servlet Message - [app#app.war]:.No Spring WebApplicationInitializer types detected on classpath

我的应用程序是使用Java Config文件而不是传统的XML配置的,我猜不到这是问题的一部分?

我发现一篇博文说有些服务器设置需要应用。我尝试过那些没有成功的人:

com.ibm.ws.webcontainer.mapFiltersToAsterisk=true
com.ibm.ws.webcontainer.removetrailingservletpathslash=true
com.ibm.ws.webcontainer.invokeFiltersCompatibility=true

我很茫然,有没有人有任何想法?

由于一些跟进,我将发布我的web.xml和WebappInitializer:

@Order(2)
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] {ApplicationConfig.class, DataSourceConfig.class, JpaConfig.class, SecurityConfig.class, MailConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] {WebMvcConfig.class};
    }

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        return new Filter[] {characterEncodingFilter};
    }

    @Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
        registration.setInitParameter("defaultHtmlEscape", "true");
        registration.setInitParameter("spring.profiles.active", "default");
    }
}

的web.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        version="3.0" metadata-complete="false">
        <!-- Map all errors to Spring MVC handler method. See CustomErrorController.generalError() -->
        <error-page>
            <location>/generalError</location>
        </error-page>
        <session-config>
          <session-timeout>15</session-timeout>
       </session-config>
       <display-name>eua</display-name>
    </web-app>

6 个答案:

答案 0 :(得分:6)

我对我的解决方案并不十分满意,但它暂时有效。 Websphere对web.xml-less初始化的支持有点不合标准。甚至他们的技术人员的回复也没有帮助。最后,我不得不将一些spring初始化移动到web.xml。我仍然可以通过配置文件配置我的大部分JPA,安全性和Web功能,但我不得不给Spring一些kickstart。以下是我感兴趣的任何人改变的web.xml。感谢大家的帮助和指导。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns="http://java.sun.com/xml/ns/javaee"
            xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
            http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
         id="WebApp_ID" version="3.0">
    <!-- Map all errors to Spring MVC handler method. See CustomErrorController.generalError() -->
    <error-page>
        <location>/generalError</location>
    </error-page>
    <session-config>
      <session-timeout>15</session-timeout>
   </session-config>
   <display-name>app</display-name>
   <context-param>
      <param-name>contextClass</param-name>
      <param-value>
          org.springframework.web.context.support.AnnotationConfigWebApplicationContext
      </param-value>
   </context-param>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>org.proj.config.ApplicationConfig 
                    org.proj.config.DefaultDataSourceConfig
                    org.proj.config.JpaConfig
                    org.proj.config.SecurityConfig
                    org.proj.config.MailConfig
                    org.proj.config.WebMvcConfig
       </param-value>
    </context-param>

    <!-- Bootstrap the root application context as usual using ContextLoaderListener -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

   <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        
        <init-param>
          <param-name>contextClass</param-name>
          <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
         </init-param>
          <!-- Again, config locations must consist of one or more comma- or space-delimited
               and fully-qualified @Configuration classes -->
          <init-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>org.proj.config.ApplicationConfig 
                           org.proj.config.DefaultDataSourceConfig
                           org.proj.config.JpaConfig
                           org.proj.config.SecurityConfig
                           org.proj.config.MailConfig
                           org.proj.config.WebMvcConfig  
               </param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <filter-mapping>
      <filter-name>springSecurityFilterChain</filter-name>
      <url-pattern>/*</url-pattern>
      <dispatcher>ERROR</dispatcher>
      <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
</web-app>

答案 1 :(得分:5)

在WebAppInitializer类

上使用@Configuration批注
@Configuration 
public class WebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) {
        // Create the 'root' Spring application context
        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.register(HibernateConfiguration.class);

        // Manage the lifecycle of the root application context
        container.addListener(new ContextLoaderListener(rootContext));

        // Create the dispatcher servlet's Spring application context
        AnnotationConfigWebApplicationContext dispatcherServlet = new AnnotationConfigWebApplicationContext();
        dispatcherServlet.register(SpringWebConfig.class);

        // Register and map the dispatcher servlet
        ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherServlet));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");

    }

 }

答案 2 :(得分:3)

我有类似的问题。 Websphere对可扫描的类数有一些默认限制。而这个SpringBoot主类可能不在这个范围内。就我而言,当我设置此JVM属性-Dclassinfocachesize = 10000(应用程序服务器&gt; server1&gt;流程定义&gt; Java虚拟机&gt;通用JVM参数&gt;)并重新启动WAS时问题得以解决

答案 3 :(得分:3)

对于我来说, IBM WAS ND 8.5.0 的工作解决方案是直接实现WebApplicationInitializer接口:

  

要将Spring Boot应用程序部署到Weblogic,您必须确保servlet初始化程序直接实现WebApplicationInitializer(即使您从已经实现它的基类扩展)。

SpringBoot 74.4

答案 4 :(得分:2)

添加@Configuration注释和直接实现WebApplicationInitializer都可以解决此问题。 (经过Websphere 8.5.0.2测试)

答案 5 :(得分:2)

我也遇到了同样的问题。我的Spring MVC(Spring 4.3)Rest应用程序正在使用Jboss,但是当我尝试在Websphere 8.5.5上进行部署时,我得到了同样的错误: SRVE0292I:Servlet消息 - [app#app.war]:没有Spring WebApplicationInitializer类路径上检测到的类型。我尝试了这篇文章和其他帖子中提出的所有选项,但没有成功。最后我发现了这个问题。当我创建Spring MVC Rest应用程序时,我使用maven archetype来创建项目,并使用空白web.xml创建了Spring MVC应用程序。由于我打算使用Spring4,基于java的初始化,我离开了arechetype创建了web.xml,并没有在web.xml中配置我的dispatcherServlet。 Jboss很聪明,可以忽略空白web.xml并找到java初始化程序类并启动应用程序。在WebSphere 8.5.5上部署相同的应用程序时,WebSphere发现空白的web.xml并在web.xml中查找DispatcherServlet信息,而不是查找java初始化程序类。删除web.xml并重新部署应用程序后,就可以使用WebSphere了。