SpringMVC + MyBatis (SSM) 是經典技術棧,但整合過程中依賴版本衝突、配置缺失、編碼不一、資源文件未打包等問題層出不窮。本文梳理 web.xml 版本、BeanCreationException、Mapper 綁定失敗、請求亂碼、參數綁定、Maven 編碼、JSON 輸出、依賴分析 八大類高頻問題,附帶排查思路與最佳實踐配置。
<web-app version="3.0" ...> <!-- 3.0 版本不提倡 listener-class 配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
version="2.5" 兼容舊寫法。ServletContainerInitializer (Spring 3.1+ 支持無 web.xml 啟動)。Caused by: java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
mvn dependency:tree
發現缺失 spring-aspects、spring-orm、spring-test 等傳遞依賴。
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${spring.version}</version></dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency>
<!-- 其他依賴 -->
</dependencies>
Maven 默認不打包 src/main/java 下的 *.xml,導致 target/classes 缺少 UserMapper.xml。
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes><include>**/*.xml</include></includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
src/main/resources/mapper/UserMapper.xml (與包結構對應)
對應 Mapper 接口包路徑,MyBatis 掃描更直觀。
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
<init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<Connector port="8080" URIEncoding="UTF-8" />new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8")日期字符串 → Date 等非基本類型需註冊 Formatter/Converter 到 FormattingConversionService。
[WARNING] Using platform encoding (GBK actually) to copy filtered resources
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported No converter found for return value of type: class com.xxx.ItemsCustom
SpringMVC 默認消息轉換器需 jackson-databind,舊版 jackson-mapper-asl 不夠。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.2</version>
</dependency>
配合 <mvc:annotation-driven> 自動註冊 MappingJackson2HttpMessageConverter。
Used undeclared dependencies: spring-context, spring-web, spring-beans (實際由 spring-webmvc 傳遞) Unused declared dependencies: spring-orm, spring-aspects, spring-test, spring-jdbc, mysql, mybatis-spring, log4j...
<scope>test</scope>,定期 mvn dependency:analyze 清理。contextConfigLocation 用 WEB-INF/classes/... 報紅,改 classpath:... 不紅,但運行均正常 (路徑解析時機不同)。<list> 標籤在 conversionService 注入 converters 時 IDE 報紅,去掉也能運行 (Spring 容器自動處理集合合並)。SSM 整合的核心難點在於 依賴版本鎖定、資源文件打包、編碼統一、消息轉換器配置 四大塊。建立標準化 pom.xml 模板、web.xml 模板、spring-mvc.xml 模板,新項目直接複製微調,能避開 90% 的坑。遇到異常先看堆棧定位 NoClassDefFoundError/BindingException,再對照依賴樹與打包產物排查,系統性解決而非盲目嘗試。