基于Java配置搭建含JPA、MySQL、Tomcat的理想Spring MVC项目
搭建Java 17/21 + Spring MVC + JPA + MySQL + Tomcat项目指南
问题1:pom.xml文件编写及依赖说明
如果用Spring Boot(推荐搭配Spring MVC),pom.xml核心依赖如下,版本适配Java 17/21和Tomcat 10/11(Spring 6+基于Jakarta EE,兼容Tomcat 10+):
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> <!-- 适配Java 17/21,兼容Tomcat 10/11 --> <relativePath/> </parent> <groupId>com.example</groupId> <artifactId>spring-mvc-jpa-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <!-- 打包为WAR部署到外部Tomcat --> <properties> <java.version>17</java.version> <tomcat.version>10.1.16</tomcat.version> <!-- 或11.x版本 --> </properties> <dependencies> <!-- Spring MVC核心依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 排除内置Tomcat,使用外部Tomcat --> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- Spring Data JPA(整合JPA+Hibernate) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <!-- 外部Tomcat依赖(编译时使用) --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>${tomcat.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <version>${tomcat.version}</version> <scope>provided</scope> </dependency> <!-- JSP及JSTL依赖 --> <dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!-- Tomcat10+调试插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat10-maven-plugin</artifactId> <version>3.0.0</version> <configuration> <port>8080</port> <path>/</path> </configuration> </plugin> </plugins> </build> </project>
如果是纯Spring MVC(非Spring Boot),需手动引入Spring Core、Spring Web MVC、Hibernate等依赖,配置繁琐,优先推荐Spring Boot。
问题2:Spring Initializr vs 从头搭建Maven Web应用
优先用Spring Initializr,理由:
- 自动生成规范项目结构,避免手动处理依赖冲突
- 一键勾选所需依赖(Web、JPA、MySQL),版本自动适配
- 自带Java-based配置基础,无需手写XML
- 支持直接选择Java版本、打包方式(WAR)
仅当需要高度自定义结构或依赖版本时,再考虑从头搭建。
问题3:项目结构最佳实践
遵循按功能分层的包结构,示例:
src/ ├── main/ │ ├── java/ │ │ └── com/example/demo/ │ │ ├── config/ # Java配置类(JPA、MVC、CORS等) │ │ ├── controller/ # 控制器(处理HTTP请求) │ │ ├── dto/ # 数据传输对象 │ │ ├── entity/ # JPA实体类(映射数据库表) │ │ ├── repository/ # JPA Repository接口(数据访问) │ │ ├── service/ # 业务逻辑层 │ │ │ └── impl/ # 业务逻辑实现类 │ │ └── DemoApplication.java # Spring Boot启动类 │ └── resources/ │ ├── application.properties # 配置文件(数据库连接、MVC参数) │ ├── static/ # 静态资源(CSS、JS、图片) │ └── templates/ # 视图文件(JSP、Thymeleaf等) └── test/ └── java/ # 测试类
配置技巧:
- 数据库连接、JPA参数优先写在
application.properties,比纯Java配置更易维护 - 用MapStruct等工具类简化DTO与实体类的转换
- 控制器只处理参数校验、调用服务层,不写业务逻辑
问题4:Java配置实现JPA连接MySQL
1. Spring Boot方式(推荐)
大部分配置通过application.properties完成,配合少量Java配置增强灵活性:
application.properties配置
# 数据库连接 spring.datasource.url=jdbc:mysql://localhost:3306/your_db_name?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true spring.datasource.username=root spring.datasource.password=your_password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # JPA/Hibernate配置 spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
自定义Java配置(可选)
在config包下创建JPA配置类:
package com.example.demo.config; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @EnableJpaRepositories(basePackages = "com.example.demo.repository") @EnableTransactionManagement public class JpaConfig { // Spring Boot默认已自动配置核心Bean,无需手动编写 }
2. 纯Spring MVC方式
需手动配置核心Bean:
@Configuration @EnableWebMvc @EnableTransactionManagement @EnableJpaRepositories(basePackages = "com.example.demo.repository") @EntityScan(basePackages = "com.example.demo.entity") public class AppConfig { @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/your_db_name?useSSL=false&serverTimezone=UTC"); dataSource.setUsername("root"); dataSource.setPassword("your_password"); return dataSource; } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource()); em.setPackagesToScan("com.example.demo.entity"); JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); HashMap<String, Object> properties = new HashMap<>(); properties.put("hibernate.hbm2ddl.auto", "update"); properties.put("hibernate.show_sql", "true"); properties.put("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect"); em.setJpaPropertyMap(properties); return em; } @Bean public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(emf); return transactionManager; } }
问题5:Tomcat上运行步骤及常见错误解决
运行步骤
- 打包项目:在项目根目录执行
mvn clean package,WAR包生成在target/目录 - 部署到Tomcat:将WAR包复制到Tomcat的
webapps/目录 - 启动Tomcat:运行
bin/startup.sh(Linux)或startup.bat(Windows) - 访问项目:浏览器打开
http://localhost:8080/[WAR包名称],若WAR包名为ROOT.war,直接访问http://localhost:8080
常见错误解决
- no origin found:CORS跨域问题,添加CORS配置:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:3000") // 允许的前端域名 .allowedMethods("GET", "POST", "PUT", "DELETE") .allowedHeaders("*") .allowCredentials(true); } } - no mapping found for GET /...xyz.jsp:
- 检查控制器是否有正确的
@GetMapping映射,比如访问/hello需对应@GetMapping("/hello")的方法 - 若用JSP视图,确保JSP放在
src/main/webapp/WEB-INF/views/目录,控制器返回视图名称即可 - 查看Tomcat日志
logs/catalina.out,定位具体部署错误
- 检查控制器是否有正确的
内容的提问来源于stack exchange,提问作者vivek
相关产品推荐
相关产品推荐

