2017-04-02 3 views
0

Spring MVC에서 응용 프로그램을 개발했으며 Run -> Run On Server에서 Eclipse에서 직접 실행할 때 제대로 작동합니다.Tomcat에 deploy 된 web.xml이없는 Spring MVC 응용 프로그램에서 404 오류가 발생합니다.

하지만 이제 전쟁을 Tomcat 폴더에 배포하고 거기에서 실행하고 싶습니다. 나는 그것에 대한 변경 작업을 수행하고 전쟁은 원하는 톰캣 폴더에 올바르게 배포되고 있지만 브라우저에서 Tomcat 서버 및 액세스 응용 프로그램 URL을 시작하면 404 오류가 발생합니다. 서버가 예외없이 시작됩니다.

다음

은 프로젝트 구조와 파일입니다 : ->

Project Structure

의 pom.xml ->

<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/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>DesertLamp</groupId> 
    <artifactId>DesertLamp</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>war</packaging> 

    <dependencies> 

     <!-- Spring --> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>4.2.6.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
      <version>4.2.6.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>4.2.6.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-tx</artifactId> 
      <version>4.2.6.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-orm</artifactId> 
      <version>4.2.6.RELEASE</version> 
     </dependency> 

     <!-- Spring Security --> 

     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-web</artifactId> 
      <version>4.1.0.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-config</artifactId> 
      <version>4.1.0.RELEASE</version> 
     </dependency> 

     <!-- Spring Data JPA --> 

     <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-jpa</artifactId> 
      <version>1.10.1.RELEASE</version> 
     </dependency> 

     <!-- Hibernate --> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>5.1.0.Final</version> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
      <version>5.2.4.Final</version> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-entitymanager</artifactId> 
      <version>5.1.0.Final</version> 
     </dependency> 

     <!-- Servlet --> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>javax.servlet-api</artifactId> 
      <version>3.1.0</version> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet.jsp</groupId> 
      <artifactId>javax.servlet.jsp-api</artifactId> 
      <version>2.3.1</version> 
     </dependency> 

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

     <dependency> 
      <groupId>javax.transaction</groupId> 
      <artifactId>jta</artifactId> 
      <version>1.1</version> 
     </dependency> 

     <!-- MySQL --> 

     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>5.1.37</version> 
     </dependency> 

     <!-- Commons Dependencies --> 

     <dependency> 
      <groupId>commons-dbcp</groupId> 
      <artifactId>commons-dbcp</artifactId> 
      <version>1.4</version> 
     </dependency> 

     <dependency> 
      <groupId>commons-fileupload</groupId> 
      <artifactId>commons-fileupload</artifactId> 
      <version>1.3.1</version> 
     </dependency> 

     <dependency> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>commons-lang3</artifactId> 
      <version>3.3.2</version> 
     </dependency> 

     <dependency> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
      <version>1.1.1</version> 
     </dependency> 

    </dependencies> 

    <build> 
    <sourceDirectory>src</sourceDirectory> 
    <plugins> 
     <plugin> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>3.1</version> 
     <configuration> 
      <source>1.8</source> 
      <target>1.8</target> 
     </configuration> 
     </plugin> 
     <plugin> 
     <artifactId>maven-war-plugin</artifactId> 
     <version>2.3</version> 
     <configuration> 
      <warSourceDirectory>WebContent</warSourceDirectory> 
      <failOnMissingWebXml>false</failOnMissingWebXml> 
      <outputDirectory>C:\apache-tomcat-7.0.76\webapps</outputDirectory> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

DesertLampWebApplicationConfig.java

프로젝트 구조 - >

@Configuration 
@EnableWebMvc 
@EnableJpaRepositories(basePackages = "co.in.desertlamp") 
@ComponentScan(basePackages = "co.in.desertlamp") 
@Import(value = { DesertLampSecurityConfiguration.class }) 
public class DesertLampWebApplicationConfig extends WebMvcConfigurerAdapter { 

    @Bean 
    public InternalResourceViewResolver viewResolver() { 
     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
     viewResolver.setViewClass(JstlView.class); 
     viewResolver.setPrefix("/WEB-INF/views/"); 
     viewResolver.setSuffix(".jsp"); 
     return viewResolver; 
    } 
} 

DesertLampInitializer.java

public class DesertLampInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

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

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return null; 
    } 

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

} 

DesertLampApplicationConfig.java

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(basePackages = "co.in.desertlamp") 
@ComponentScan({ "co.in.desertlamp" }) 
@PropertySource(value = { "classpath:/co/in/desertlamp/resources/desertlamp.properties" }) 
public class DesertLampApplicationConfig { 

    private static final String DATABASE_DRIVER = "db.driver"; 
    private static final String DATABASE_URL = "db.url"; 
    private static final String DATABASE_USERNAME = "db.username"; 
    private static final String DATABASE_PASSWORD = "db.password"; 

    private static final String HIBERNATE_DIALECT = "hibernate.dialect"; 
    private static final String HIBERNATE_SHOWSQL = "hibernate.show_sql"; 
    private static final String HIBERNATE_FORMATSQL = "hibernate.format_sql"; 
    private static final String HIBERNATE_HBM2DDL = "hibernate.hbm2ddl.auto"; 

    @Resource 
    private Environment environment; 

    @Bean 
    public LocalSessionFactoryBean sessionFactory() { 
     LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(dataSource()); 
     sessionFactory.setPackagesToScan(new String[] { "co.in.desertlamp" }); 
     sessionFactory.setHibernateProperties(hibernateProperties()); 
     return sessionFactory; 
    } 

    @Bean 
    public DataSource dataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(environment.getRequiredProperty(DATABASE_DRIVER)); 
     dataSource.setUrl(environment.getRequiredProperty(DATABASE_URL)); 
     dataSource.setUsername(environment.getRequiredProperty(DATABASE_USERNAME)); 
     dataSource.setPassword(environment.getRequiredProperty(DATABASE_PASSWORD)); 
     return dataSource; 
    } 

    @Bean 
    @Conditional(DataSourceCondition.class) 
    public DataSourceInitializer dataSourceInitializer(DataSource dataSource) { 
     ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator(); 
     //Put Logger here 
     resourceDatabasePopulator.addScript(new ClassPathResource("/co/in/desertlamp/scripts/loadUserAndRoleData.sql")); 
     DataSourceInitializer dataSourceInitializer = new DataSourceInitializer(); 
     dataSourceInitializer.setDataSource(dataSource); 
     dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator); 
     return dataSourceInitializer; 
    } 

    private Properties hibernateProperties() { 
     Properties hibernateProperties = new Properties(); 
     hibernateProperties.put(HIBERNATE_DIALECT, environment.getRequiredProperty(HIBERNATE_DIALECT)); 
     hibernateProperties.put(HIBERNATE_SHOWSQL, environment.getRequiredProperty(HIBERNATE_SHOWSQL)); 
     hibernateProperties.put(HIBERNATE_FORMATSQL, environment.getRequiredProperty(HIBERNATE_FORMATSQL)); 
     hibernateProperties.put(HIBERNATE_HBM2DDL, environment.getRequiredProperty(HIBERNATE_HBM2DDL)); 
     return hibernateProperties;   
    } 

    @Bean(name = "entityManagerFactory") 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
     entityManagerFactoryBean.setDataSource(dataSource()); 
     entityManagerFactoryBean.setPackagesToScan(new String[] { "co.in.desertlamp" }); 

     JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 

     entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter); 
     entityManagerFactoryBean.setJpaProperties(hibernateProperties()); 
     return entityManagerFactoryBean; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager(
      EntityManagerFactory entityManagerFactory) { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(entityManagerFactory); 
     return transactionManager; 
    } 
} 

->가 server.xml

0,123,516
<?xml version='1.0' encoding='utf-8'?> 
<!-- 
    Licensed to the Apache Software Foundation (ASF) under one or more 
    contributor license agreements. See the NOTICE file distributed with 
    this work for additional information regarding copyright ownership. 
    The ASF licenses this file to You under the Apache License, Version 2.0 
    (the "License"); you may not use this file except in compliance with 
    the License. You may obtain a copy of the License at 

     http://www.apache.org/licenses/LICENSE-2.0 

    Unless required by applicable law or agreed to in writing, software 
    distributed under the License is distributed on an "AS IS" BASIS, 
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
    See the License for the specific language governing permissions and 
    limitations under the License. 
--> 
<!-- Note: A "Server" is not itself a "Container", so you may not 
    define subcomponents such as "Valves" at this level. 
    Documentation at /docs/config/server.html 
--> 
<Server port="8005" shutdown="SHUTDOWN"> 
    <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> 
    <!-- Security listener. Documentation at /docs/config/listeners.html 
    <Listener className="org.apache.catalina.security.SecurityListener" /> 
    --> 
    <!--APR library loader. Documentation at /docs/apr.html --> 
    <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> 
    <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html --> 
    <Listener className="org.apache.catalina.core.JasperListener" /> 
    <!-- Prevent memory leaks due to use of particular java/javax APIs--> 
    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> 
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> 
    <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> 

    <!-- Global JNDI resources 
     Documentation at /docs/jndi-resources-howto.html 
    --> 
    <GlobalNamingResources> 
    <!-- Editable user database that can also be used by 
     UserDatabaseRealm to authenticate users 
    --> 
    <Resource name="UserDatabase" auth="Container" 
       type="org.apache.catalina.UserDatabase" 
       description="User database that can be updated and saved" 
       factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 
       pathname="conf/tomcat-users.xml" /> 
    </GlobalNamingResources> 

    <!-- A "Service" is a collection of one or more "Connectors" that share 
     a single "Container" Note: A "Service" is not itself a "Container", 
     so you may not define subcomponents such as "Valves" at this level. 
     Documentation at /docs/config/service.html 
    --> 
    <Service name="Catalina"> 

    <!--The connectors can use a shared executor, you can define one or more named thread pools--> 
    <!-- 
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 
     maxThreads="150" minSpareThreads="4"/> 
    --> 


    <!-- A "Connector" represents an endpoint by which requests are received 
     and responses are returned. Documentation at : 
     Java HTTP Connector: /docs/config/http.html (blocking & non-blocking) 
     Java AJP Connector: /docs/config/ajp.html 
     APR (HTTP/AJP) Connector: /docs/apr.html 
     Define a non-SSL HTTP/1.1 Connector on port 8080 
    --> 
    <Connector port="8080" protocol="HTTP/1.1" 
       connectionTimeout="20000" 
       redirectPort="8443" /> 
    <!-- A "Connector" using the shared thread pool--> 
    <!-- 
    <Connector executor="tomcatThreadPool" 
       port="8080" protocol="HTTP/1.1" 
       connectionTimeout="20000" 
       redirectPort="8443" /> 
    --> 
    <!-- Define a SSL HTTP/1.1 Connector on port 8443 
     This connector uses the BIO implementation that requires the JSSE 
     style configuration. When using the APR/native implementation, the 
     OpenSSL style configuration is required as described in the APR/native 
     documentation --> 
    <!-- 
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" 
       maxThreads="150" SSLEnabled="true" scheme="https" secure="true" 
       clientAuth="false" sslProtocol="TLS" /> 
    --> 

    <!-- Define an AJP 1.3 Connector on port 8009 --> 
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 


    <!-- An Engine represents the entry point (within Catalina) that processes 
     every request. The Engine implementation for Tomcat stand alone 
     analyzes the HTTP headers included with the request, and passes them 
     on to the appropriate Host (virtual host). 
     Documentation at /docs/config/engine.html --> 

    <!-- You should set jvmRoute to support load-balancing via AJP ie : 
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> 
    --> 
    <Engine name="Catalina" defaultHost="localhost"> 

     <!--For clustering, please take a look at documentation at: 
      /docs/cluster-howto.html (simple how to) 
      /docs/config/cluster.html (reference documentation) --> 
     <!-- 
     <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> 
     --> 

     <!-- Use the LockOutRealm to prevent attempts to guess user passwords 
      via a brute-force attack --> 
     <Realm className="org.apache.catalina.realm.LockOutRealm"> 
     <!-- This Realm uses the UserDatabase configured in the global JNDI 
      resources under the key "UserDatabase". Any edits 
      that are performed against this UserDatabase are immediately 
      available for use by the Realm. --> 
     <Realm className="org.apache.catalina.realm.UserDatabaseRealm" 
       resourceName="UserDatabase"/> 
     </Realm> 

     <Host name="localhost" appBase="webapps" 
      unpackWARs="true" autoDeploy="true"> 

     <!-- SingleSignOn valve, share authentication between web applications 
      Documentation at: /docs/config/valve.html --> 
     <!-- 
     <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> 
     --> 

     <!-- Access log processes all example. 
      Documentation at: /docs/config/valve.html 
      Note: The pattern used is equivalent to using pattern="common" --> 
     <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" 
       prefix="localhost_access_log." suffix=".txt" 
       pattern="%h %l %u %t &quot;%r&quot; %s %b" /> 

     </Host> 
    </Engine> 
    </Service> 
</Server> 

-> 웹 콘텐츠 구조

enter image description here

-> DefaultController.java

@Controller 
public class DefaultController { 

    @Autowired 
    private UserService userService; 

    @RequestMapping(value = { "/", "/home" }, method = RequestMethod.GET) 
    public ModelAndView defaultPage() { 
     ModelAndView model = new ModelAndView(); 
     model.setViewName("common/pgDefault"); 
     return model; 
    } 

    @RequestMapping(value = "/login", method = RequestMethod.GET) 
    public ModelAndView loginPage(@RequestParam(value = "error",required = false) String error, 
      @RequestParam(value = "logout", required = false) String logout) { 

     ModelAndView model = new ModelAndView(); 
     if (error != null) { 
      model.addObject("error", "Invalid Email OR Password"); 
     } 

     if (logout != null) { 
      model.addObject("message", "You are successfully logged out"); 
     } 

     model.setViewName("common/pgLogin"); 
     return model; 
    } 

    @RequestMapping(value="/welcome", method = RequestMethod.GET) 
    public String welcomePage(ModelMap model){ 
     String userEmailID = DesertLampUtils.getPrincipal(); 
     User user = userService.findByEmail(userEmailID); 
     String userFirstName = user.getFirstName(); 
     model.addAttribute("userFirstName",userFirstName); 
     return "common/pgWelcome"; 
    } 

    @RequestMapping(value = "/Access_Denied", method = RequestMethod.GET) 
    public ModelAndView accessDeniedPage(Principal principal) { 
     ModelAndView model = new ModelAndView(); 
     String currentUser = DesertLampUtils.getPrincipal(); 
     model.addObject("currentUser", currentUser); 
     model.setViewName("common/pgAccessDenied"); 
     return model; 
    } 

} 

내가 요청하고 URL이 http://localhost:8080/DesertLamp-0.0.1-SNAPSHOT/입니다.

미리 감사드립니다.

+0

브라우저에서 요청하는 URL은 무엇입니까? – developer

+0

요청한 URL을 표시하십시오. –

+0

@javaguy - 요청한 URL은 http : // localhost : 8080/DesertLamp-0.0.1-SNAPSHOT /입니다. –

답변

1

코드를 테스트 한 후에 SQL과 속성 파일을 찾을 수없는 이유 때문에 응용 프로그램이 제대로 시작되지 않기 때문에 404가 표시되는 이유를 확인했습니다.

코드에서 sql 및 특성 파일은 Java 코드와 함께 배치됩니다. maven이 java 코드를 컴파일 할 때 sql과 properties 파일은 java 파일이 아니기 때문에 무시됩니다. 따라서 그들은 클래스 폴더로 이동하지 못했습니다. 런타임 중에는 액세스 할 수 없습니다.

maven에는 세 개의 기본 폴더가 있습니다. src/main/java. src/main/resources, src/test/java. 자바 코드는 첫 번째 코드로 이동해야하며, 테스트는 마지막 코드로 이동해야하며 리소스는 두 번째 코드로 이동해야한다. 따라서 속성, sql 파일은 src/main/resource 폴더에 있어야합니다. 컴파일하는 동안 src/main/resource 폴더의 모든 내용이 WEB-INF/classes/폴더에 저장됩니다.따라서 classpath : xxxx.properties 경로 아래에서 액세스 할 수 있습니다.

+0

감사합니다. 그것은 나를 위해 일했습니다. –