1

Eclipseで問題なく実行される小さなJava/Spring MVC REST / Mavenアプリがありますが、プロンプトから次のコマンドを実行した場合も同様です。

mvn clean tomcat6:run

私の問題は私がするときです:

mvnクリーンパッケージ

生成されたwarファイルをスタンドアロンのTomcatインスタンスの「webapps」フォルダーにプッシュすると、サービスが機能しなくなります。

スタンドアロンのTomcatは問題なく起動し、ログにエラーはありません。興味深いことに、Eclipseで、またはmvnコマンドを使用してアプリを実行すると、スタンドアロンインスタンスはポート8989と8080でリッスンします。

アプリがスタンドアロンのTomcatで起動したら、RESTClientを使用してサービスをヒットしようとすると、404が返されます。私のカスタム404は実際には、一般的なものではありません。

また、私のindex.htmlのような静的コンテンツも問題なく表示されます。

これが私のweb.xmlファイルです:

    <?xml version="1.0" encoding="ISO-8859-1"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <display-name>Skunk User Interface</display-name>

  <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>file:///${APPS_CONFIG}/log4j.xml</param-value>
  </context-param>

  <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  </listener>

  <servlet>
    <servlet-name>skunk</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/skunk-servlet.xml
    </param-value>
  </context-param>

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

  <servlet-mapping>
    <servlet-name>skunk</servlet-name>
    <url-pattern>/skunk/*</url-pattern>
  </servlet-mapping>

  <!-- Healthcheck mapping -->
  <servlet-mapping>
    <servlet-name>skunk</servlet-name>
    <url-pattern>/health/*</url-pattern>
  </servlet-mapping>

  <error-page>
    <error-code>404</error-code>
    <location>/WEB-INF/404.htm</location>
  </error-page>
</web-app>

そして、skunk-servlet.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xsi:schemaLocation="
         http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
         http://www.springframework.org/schema/mvc
         http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.1.xsd
         http://www.springframework.org/schema/tx
         http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
         http://www.springframework.org/schema/aop 
         http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
         http://www.springframework.org/schema/cache 
         http://www.springframework.org/schema/cache/spring-cache-3.1.xsd">

    <tx:annotation-driven/>

    <!-- Load configuration settings -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="ignoreUnresolvablePlaceholders" value="true" />
    </bean>

    <bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
      <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
      <property name="searchContextAttributes" value="true" />
      <property name="contextOverride" value="true" />
      <property name="ignoreResourceNotFound" value="true" />
      <property name="locations">
        <list>
          <value>classpath:config/application.properties</value>
          <value>file:///${APPS_CONFIG}/application.properties</value>
        </list>
      </property>
    </bean>

  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
  </bean>

  <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate" 
    c:dataSource-ref="dataSource" />

  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource">
      <ref bean="dataSource"/>
    </property>
    <property name="hibernateProperties">
      <props>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
      </props>
    </property>
  </bean>

  <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" 
    p:sessionFactory-ref="sessionFactory" />

  <!-- Auto scan the components -->
  <context:component-scan base-package="com.skunk.myapp" />
  <mvc:annotation-driven/>

    <cache:annotation-driven />

    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager" ref="ehcache"/>
    </bean>
    <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="configLocation" value="classpath:/ehcache.xml"/>
    </bean> 

  <aop:aspectj-autoproxy proxy-target-class="true" />

</beans>

その構成に、ディスパッチャーサーブレットへの要求がコントローラーにルーティングする代わりに404を返す理由を説明するものはありますか?

ありがとう


アップデート:

Tomcatスタンドアロンからのログ出力の追加。

catalina。[date].log:

Sep 13, 2012 1:47:28 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jdk1.6.0_31\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;.
Sep 13, 2012 1:47:28 PM org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
Sep 13, 2012 1:47:28 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 673 ms
Sep 13, 2012 1:47:28 PM org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
Sep 13, 2012 1:47:28 PM org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.32
Sep 13, 2012 1:47:28 PM org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor host-manager.xml
Sep 13, 2012 1:47:29 PM org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor manager.xml
Sep 13, 2012 1:47:29 PM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive skunk.war
Sep 13, 2012 1:47:44 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory docs
Sep 13, 2012 1:47:44 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory examples
Sep 13, 2012 1:47:44 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory ROOT
Sep 13, 2012 1:47:44 PM org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
Sep 13, 2012 1:47:44 PM org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
Sep 13, 2012 1:47:44 PM org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/19  config=null
Sep 13, 2012 1:47:44 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 16106 ms

localhost。[date].log:

Sep 13, 2012 1:47:39 PM org.apache.catalina.core.ApplicationContext log
INFO: Set web app root system property: 'webapp.root' = [C:\Users\my.user\Tomcat\webapps\skunk\]
Sep 13, 2012 1:47:39 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing log4j from [file:///${APPS_CONFIG}/log4j.xml]
Sep 13, 2012 1:47:39 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
Sep 13, 2012 1:47:43 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring FrameworkServlet 'skunk'
Sep 13, 2012 1:47:44 PM org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextInitialized()
Sep 13, 2012 1:47:44 PM org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextInitialized()
4

3 に答える 3

2

単にyourproject.warTomcatのwebappsフォルダーにコピーし、デフォルトのデプロイヤーを起動させる(yourproject.warという名前のディレクトリーに展開するyourproject)場合、デフォルトのTomcatロジックは、のコンテキストパス(読み取り:URL)でアプリを使用可能にすることであることに注意してください/yourproject

アプリをルートコンテキスト(/)で使用できるようにする場合は、Tomcatを適切に構成する必要があります。

于 2012-09-13T19:00:52.940 に答える
1

これがあなたの組み合わせです。

アプリ-環境ステータス
Eclipse->動作中のEclipseEmbeddedTOMCAT->
動作中の
スタンドアロンTOMCAT->動作していない

Eclipse Tomcatの設定を参照してください。これにより、Tomcatが識別できるようにするクラスパスとライブラリパスが追加されている可能性があります。過去に同様の問題に直面しました。

また、静的コンテンツは正常に機能します。これは、実行する重要なjarが、スタンドアロンのTomcatでは表示されないEclipseクラスパスに存在することを意味します。

乾杯

于 2012-09-13T19:09:20.377 に答える
1

理解した。web.xmlのサーブレットマッピングを次のように変更する必要がありました。

  <servlet-mapping>
    <servlet-name>skunk</servlet-name>
    <url-pattern>/skunk/*</url-pattern>
  </servlet-mapping>

これに:

  <servlet-mapping>
    <servlet-name>skunk</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

URLを使用してサービスにアクセスできるようにするには:

http://localhost:8080/skunk/myService

そこにあった元のマッピングは、次のように入力する必要があることを意味していました。

http://localhost:8080/skunk/skunk/myService

私のサービスに到達するために...ため息

君たちありがとう!

于 2012-09-13T21:18:02.013 に答える