2015-04-26 2 views
8

Я запускаю приложение Tomcat7 с использованием Spring MVC на OpenShift в домене: financial-datasite.rhcloud.com. Я запускаю и тестирую приложение локально с помощью сервера Tomcat, а затем выталкиваю его в удаленный репозиторий. В настоящее время есть только HomePage и кнопка под переадресацией на другую страницу. При тестировании локально обе страницы отображают содержимое, как ожидалось. Однако при развертывании на удаленном сервере отображается только HomePage, а при нажатии кнопки появляется ошибка HTTP 404. Здесь я столкнулся с различными аналогичными вопросами, но ни один из них не помог до сих пор. Я играл вокруг настройки web.xml, pom.xml, servlet-context.xml и файлов контроллера. Однако ни один из них не помог. Я также проверки tail files and logs контролировать то, что происходит, что свидетельствует о том, что удаленный сервер доступ к какому-либо методу «printWelcome» (который даже не существует в моем проекте) в классе контроллера для второй страницы:Openshift Spring MVC Возвращает путь развертывания приложения Tomcat 404

INFO : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/Sectors],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String com.spring.mvc.SectorController.printWelcome(org.springframework.ui.ModelMap) 

Вот мой project structure. В моем localhost страница по умолчанию запускается как localhost:8181/mvc/, а вторая страница запускается как http://localhost:8181/mvc/Sectors. Аналогичным образом, после развертывания, домашняя страница запускается как http://financial-datasite.rhcloud.com, а вторая страница выполняется как http://financial-datasite.rhcloud.com/Sectors, что вызывает ошибку 404 для /WEB-INF/views/hello.jsp, которая, опять же, даже не существует в моей директории проекта , Еще одна вещь, которую я наблюдал в файлах журналов, заключается в том, что код, скорее всего, не попадет в класс SectorController, поскольку я закодирован для записи команд печати, которые на самом деле не регистрируются в консоли при запросе страницы с развернутого сайта. Я совершенно не уверен, какие файлы запускаются на удаленном сервере, и если есть какие-либо проблемы с конфигурацией, о которых я не знаю. Ниже приведены мои web.xml, pom.xml, servlet-context.xml, Sectors.jsp, Google-Maps.js, откуда я вызвал новую страницу для загрузки) и SectorController.java (который является файлом контроллера для вторая страница). Извините за длинный вопрос, пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Любая помощь будет оценена, спасибо.

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="WebApp_ID" 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_2_5.xsd" version="2.5"> 

    <display-name>Financial Data Site</display-name> 

    <servlet> 
    <servlet-name>financial</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 
     </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>financial</servlet-name> 
    <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/spring/root-context.xml</param-value> 
    </context-param> 

    <listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <welcome-file-list> 
    <welcome-file>index</welcome-file> 
    </welcome-file-list> 

</web-app> 

pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<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> 
    <groupId>com.spring</groupId> 
    <artifactId>mvc</artifactId> 
    <name>SpringMVC</name> 
    <packaging>war</packaging> 
    <version>1.0.0-BUILD-SNAPSHOT</version> 

    <properties> 
     <java-version>1.6</java-version> 
     <org.springframework-version>3.1.1.RELEASE</org.springframework-version> 
     <org.aspectj-version>1.6.10</org.aspectj-version> 
     <org.slf4j-version>1.6.6</org.slf4j-version> 

     <!-- Newly Added from here --> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <maven.compiler.source>1.6</maven.compiler.source> 
     <maven.compiler.target>1.6</maven.compiler.target> 
    </properties> 

    <repositories> 
     <repository> 
      <id>eap</id> 
      <url>http://maven.repository.redhat.com/techpreview/all</url> 
      <releases> 
       <enabled>true</enabled> 
      </releases> 
      <snapshots> 
       <enabled>true</enabled> 
      </snapshots> 
     </repository> 
    </repositories> 

    <pluginRepositories> 
     <pluginRepository> 
      <id>eap</id> 
      <url>http://maven.repository.redhat.com/techpreview/all</url> 
      <releases> 
       <enabled>true</enabled> 
      </releases> 
      <snapshots> 
       <enabled>true</enabled> 
      </snapshots> 
     </pluginRepository> 
    </pluginRepositories> 
    <!-- Till here --> 

    <dependencies> 

     <!-- Spring --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>${org.springframework-version}</version> 
      <exclusions> 
       <!-- Exclude Commons Logging in favor of SLF4j --> 
       <exclusion> 
        <groupId>commons-logging</groupId> 
        <artifactId>commons-logging</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>${org.springframework-version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
      <version>${org.springframework-version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>${org.springframework-version}</version> 
     </dependency> 

     <!-- MySQL database driver --> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>5.1.34</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-jdbc</artifactId> 
      <version>${org.springframework-version}</version> 
     </dependency> 

     <!-- Hibernate --> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>3.6.10.Final</version> 
     </dependency> 

     <!-- AspectJ --> 
     <dependency> 
      <groupId>org.aspectj</groupId> 
      <artifactId>aspectjrt</artifactId> 
      <version>${org.aspectj-version}</version> 
     </dependency> 

     <!-- Logging --> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>${org.slf4j-version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>jcl-over-slf4j</artifactId> 
      <version>${org.slf4j-version}</version> 
      <scope>runtime</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-log4j12</artifactId> 
      <version>${org.slf4j-version}</version> 
      <scope>runtime</scope> 
     </dependency> 

     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>1.2.15</version> 
      <exclusions> 
       <exclusion> 
        <groupId>javax.mail</groupId> 
        <artifactId>mail</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>javax.jms</groupId> 
        <artifactId>jms</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>com.sun.jdmk</groupId> 
        <artifactId>jmxtools</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>com.sun.jmx</groupId> 
        <artifactId>jmxri</artifactId> 
       </exclusion> 
      </exclusions> 
      <scope>runtime</scope> 
     </dependency> 

     <!-- @Inject --> 
     <dependency> 
      <groupId>javax.inject</groupId> 
      <artifactId>javax.inject</artifactId> 
      <version>1</version> 
     </dependency> 

     <!-- JSTL --> 
     <dependency> 
      <groupId>jstl</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.2</version> 
      <scope>compile</scope> 
     </dependency> 

     <!-- Tag Library --> 
     <dependency> 
      <groupId>taglibs</groupId> 
      <artifactId>standard</artifactId> 
      <version>1.1.2</version> 
      <scope>compile</scope> 
     </dependency> 

     <!-- Servlet --> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>servlet-api</artifactId> 
      <version>2.5</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet.jsp</groupId> 
      <artifactId>jsp-api</artifactId> 
      <version>2.1</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.2</version> 
     </dependency> 

     <!-- Test --> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.7</version> 
      <scope>test</scope> 
     </dependency>   
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <artifactId>maven-eclipse-plugin</artifactId> 
       <version>2.9</version> 
       <configuration> 
        <additionalProjectnatures> 
         <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature> 
        </additionalProjectnatures> 
        <additionalBuildcommands> 
         <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand> 
        </additionalBuildcommands> 
        <downloadSources>true</downloadSources> 
        <downloadJavadocs>true</downloadJavadocs> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.5.1</version> 
       <configuration> 
        <source>1.6</source> 
        <target>1.6</target> 
        <compilerArgument>-Xlint:all</compilerArgument> 
        <showWarnings>true</showWarnings> 
        <showDeprecation>true</showDeprecation> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>exec-maven-plugin</artifactId> 
       <version>1.2.1</version> 
       <configuration> 
        <mainClass>org.test.int1.Main</mainClass> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

    <profiles> 
     <profile> 
      <!-- When built in OpenShift the 'openshift' profile will be 
       used when invoking mvn. --> 
      <!-- Use this profile for any OpenShift specific customization 
       your app will need. --> 
      <!-- By default that is to put the resulting archive into the 
       'deployments' folder. --> 
      <!-- http://maven.apache.org/guides/mini/guide-building-for-different-environments.html --> 
      <id>openshift</id> 
      <build> 
      <finalName>financial</finalName> 
       <plugins> 
        <plugin> 
         <artifactId>maven-war-plugin</artifactId> 
         <version>2.4</version> 
         <configuration> 
          <outputDirectory>webapp</outputDirectory> 
          <warName>ROOT</warName> 
         </configuration> 
        </plugin> 
       </plugins> 
      </build> 
     </profile> 
    </profiles> 

</project> 

сервлет-context.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/mvc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

    <annotation-driven /> 

    <context:component-scan base-package="com.spring.mvc" /> 

    <resources mapping="/resources/**" location="/resources/" /> 

    <beans:bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <beans:property name="prefix" value="/WEB-INF/views/" /> 
     <beans:property name="suffix" value=".jsp" /> 
    </beans:bean> 

</beans:beans> 

Sectors.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> 
<%@ page session="false"%> 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 

<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Sectors</title> 
</head> 

<body> 
    <h1>Message</h1> 
    <c:if test="${not empty Sectors}"> 

     <ul> 
      <c:forEach var="_SectorNames" items="${Sectors}"> 
       <li>${_SectorNames}</li> 
      </c:forEach> 
     </ul> 

    </c:if> 
</body> 

</html> 

Google-Maps.js: Следующий фрагмент кода содержит только функцию, используемую для создания раздела Див на карте и назвать новую страницу в новом окне

function HomeControl(controlDiv, map) 
{ 
     // Set CSS for the control border. 
     var _ControlUI = document.createElement('div'); 
     _ControlUI.style.backgroundColor = '#fff'; 
     _ControlUI.style.border = '2px solid #fff'; 
     _ControlUI.style.borderRadius = '3px'; 
     _ControlUI.style.boxShadow = '0 2px 6px rgba(0,0,0,.3)'; 
     _ControlUI.style.cursor = 'pointer'; 
     _ControlUI.style.marginBottom = '22px'; 
     _ControlUI.style.textAlign = 'center'; 
     _ControlUI.title = 'Click to filter by Sectors'; 
     controlDiv.appendChild(_ControlUI); 

     // Set CSS for the control interior. 
     var _ControlText = document.createElement('div'); 
     _ControlText.style.color = 'rgb(25,25,25)'; 
     _ControlText.style.fontFamily = 'Roboto,Arial,sans-serif'; 
     _ControlText.style.fontSize = '12px'; 
     _ControlText.style.lineHeight = '38px'; 
     _ControlText.style.paddingLeft = '5px'; 
     _ControlText.style.paddingRight = '5px'; 
     _ControlText.innerHTML = '<strong>View by Sectors</strong>'; 
     _ControlUI.appendChild(_ControlText); 

     // Setup the click event listeners, also calls Sectors page on a new window 
     google.maps.event.addDomListener(_ControlUI, 'click', function() { 
      //add code here to redirect to Sectors page 
      var _Window = window.open('/mvc/Sectors', '__blank'); 
      _Window.focus(); 
     }); 
} 

SectorController.java

package com.spring.mvc; 

    import java.text.DateFormat; 
    import java.util.ArrayList; 
    import java.util.Date; 
    import java.util.List; 
    import java.util.Locale; 

    import org.slf4j.Logger; 
    import org.slf4j.LoggerFactory; 
    import org.springframework.stereotype.Controller; 
    import org.springframework.ui.Model; 
    import org.springframework.web.bind.annotation.RequestMapping; 
    import org.springframework.web.bind.annotation.RequestMethod; 
    import org.springframework.web.servlet.ModelAndView; 

    import com.spring.dao.impl.SectorDAOImpl; 
    import com.spring.model.Sector; 

    @Controller 
    public class SectorController { 

     private static final Logger logger = LoggerFactory.getLogger(SectorController.class); 

     @RequestMapping(value = "/Sectors", method = {RequestMethod.HEAD, RequestMethod.GET}) 
     public ModelAndView DisplaySectors(Locale locale, Model model) { 

      logger.info("Welcome home! You are in: {}.", locale); 

      Date date = new Date(); 
      DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); 

      String formattedDate = dateFormat.format(date); 

      model.addAttribute("serverTime", formattedDate); 

      SectorDAOImpl _SectorDAOImpl = new SectorDAOImpl(); 
      List<Sector> _Sectors = _SectorDAOImpl.GetByID();  
      List<String> _SectorNames = new ArrayList<String>(); 

      for(Sector sector : _Sectors) { 
       _SectorNames.add(sector.getSectorName()); 
      } 

      ModelAndView _ModelAndView = new ModelAndView("Sectors"); 
      _ModelAndView.addObject("Sectors", _SectorNames); 

      return _ModelAndView; 
     } 
} 
+0

Можете ли вы опубликовать также код, где кнопка подает запрос на страницу, пожалуйста? Также вы можете разместить изображение с вашей структурой проекта, пожалуйста, – Jessai

+0

Отправленный код JavaScript, который запрашивает новую страницу. Я также разместил ссылку на изображение структуры проекта по вышеуказанному вопросу, вот ссылка для ссылки: http://imgur.com/WhOuzJB. Благодарю. –

+0

В этой строке: var _Window = window.open ('/ mvc/Sectors', '__blank'); Почему вы префикс «/ mvc /»? Это название вашего проекта? – Jessai

ответ

4
  1. Как отмечалось Jessai в комментарии,

    var _Window = window.open('/mvc/Sectors', '__blank'); 
    

    Не используйте имя проекта явно! Есть способы получить ваше имя контекста, например метод request.getContextPath() HttpServletRequest.

    В этом случае с жестко закодированной строкой URL-адреса я считаю, что вы можете использовать относительный URL-адрес, просто «Секторы» или «./Sectors».

    Ссылки:

  2. '__blank': Вы имели в виду '_blank'?

  3. Кстати:

    При развертывании на сервере Tomcat 7, так что вы можете объявить приверженность Servlet 3.0 спецификации вместо 2.5 в файле web.xml.

    См следующий отключить проверку компонентов при запуске:
    https://wiki.apache.org/tomcat/HowTo/FasterStartUp#Configure_your_web_application

  4. На

    INFO : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/Sectors],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String com.spring.mvc.SectorController.printWelcome(org.springframework.ui.ModelMap) 
    

    Если файл класса не совпадает с исходным кодом, то это означает, что ваш код не был составлен , Удалите скомпилированные классы (например, используйте mvn clean) и повторите попытку.

    Если вам интересно, вы можете распаковать свой военный файл любым приложением архивирования ZIP и посмотреть, что на самом деле там.

  5. У вас или нашей компании есть доменное имя http://spring.com? Если нет, НЕ используйте имя пакета com.spring и не используйте <groupId>com.spring</groupId>. Эти имена не принадлежат вам. Это чужая собственность.

  6. На

    <org.springframework-version>3.1.1.RELEASE</org.springframework-version> 
    

    Если вы используете 3.x, почему не ток 3.2.12.RELEASE в серии 3.x, или лучше последнего 4.1.6.RELEASE? Spring Framework 3.1.x достигла конца жизни и больше не поддерживается.

+0

Спасибо за ваш ответ! Я действительно пробовал все вышеперечисленные шаги, которые вы рекомендовали, за исключением последнего на 4-м месте (распакуйте WAR и посмотрите, что на самом деле там). Если вы говорите о распаковке файла WAR, который я загрузил самостоятельно, у него есть все ожидаемые коды, которые у меня есть на моей клиентской машине. Однако при развертывании путь возвращает ошибку 404. –

+0

Включите AccessLogValve в конфигурации вашего сервера, чтобы создать файл журнала доступа для ваших запросов, чтобы вы могли видеть, какие URL-адреса запрашивает ваш клиент (браузер). В Tomcat вы можете включить глобальный журнал доступа для своего хоста в файле conf/server.xml. (Я не знаю, верно ли это для «jbossews», который вы используете. Это другое программное обеспечение). –

Смежные вопросы