文章目錄
- 一、java.lang.ClassNotFoundException: org.slf4j.event.LoggingEvent
- 二、錯誤400-The request sent by the client was syntactically incorrect
- 三、解決@RequestParam註解傳入中文亂碼。
- 四、解決地址欄中文參數亂碼
- 五、在springmvc.xml中配置前端控制器哪些靜態資源不被攔截
- 六、解決idea創建的maven項目右鍵new XMLconfiguration File沒有Spring config選項
- 七、 Content type 'application/json;charset=UTF-8' not supported
- 八、Spring配置提示: File is included in 4 contexts
一、java.lang.ClassNotFoundException: org.slf4j.event.LoggingEvent
原因:沒有導入相關jar包。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.6</version>
</dependency>
如果不加日誌信息,會產生warning
log4j.rootLogger = debug,stdout,D,E
# 控制輸入的級別
log4j.category.org.springframework = ERROR
# 向控制檯直接打印
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
# 寫入控制檯
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%m%n
# 每天收集
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
# 寫入文件
log4j.appender.D.File = D://logs/springmvc.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =D://logs/springmvc.log
log4j.appender.E.Append = true
# 收集error及其以上信息
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss} [ %t\:%r ] - [ %p ] %m%n
二、錯誤400-The request sent by the client was syntactically incorrect
錯誤原因,前臺傳入的參數name和後臺controller中接收參數名稱不一致或模型格式不一致。比如日期類型,我在前臺傳入2000-5-16
就會導致該問題。
解決辦法:
/**
* 自定義類型轉換,把字符串轉換成日期
* @author Summerday
*/
public class StringToDateConverter implements Converter<String, Date> {
/**
* 字符串--> 日期
* @param source 傳進來的字符串
* @return
*/
@Override
public Date convert(String source) {
if (source == null){
throw new RuntimeException("請您傳入數據!");
}
//解決2000/1/11格式問題
source = source.replace('/', '-');
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
//把字符串轉換爲日期
try {
return df.parse(source);
} catch (Exception e) {
throw new RuntimeException("類型轉換出現錯誤!");
}
}
}
<!--配置自定義類型轉換器-->
<bean id="conversionService2" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.smday.utils.StringToDateConverter"></bean>
</set>
</property>
</bean>
三、解決@RequestParam註解傳入中文亂碼。
之前寫過一篇文章提到tomcat服務器編碼的問題:必須理清Tomcat編解碼問題,對於post請求,我們只需要在web.xml中配置中文亂碼過濾器即可。
<!--配置中文亂碼過濾器-->
<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>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
這個過濾器相當於給request和response都加上了適合的編碼信息,但這僅僅適用於post請求(輸出響應的時候需要加上個response.setContentType("text/html;charset=utf-8");
:
@Override
protected void doFilterInternal(
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String encoding = getEncoding();
if (encoding != null) {
if (isForceRequestEncoding() || request.getCharacterEncoding() == null) {
request.setCharacterEncoding(encoding);
}
if (isForceResponseEncoding()) {
response.setCharacterEncoding(encoding);
}
}
filterChain.doFilter(request, response);
}
但是對於get方法,還需要考慮其他的因素:比如tomcat的版本,tomcat8之後的版本默認是utf-8的編碼,所以get方式是不會亂碼的,但這之前的版本,默認的是iso8859-1,我們解決的方法也很多:
- 修改tomcat的版本,可以在配置文件中修改。
- pom.xml修改tomcat7插件的編碼。
<!--tomcat插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 通過maven tomcat8:run運行項目時,訪問項目的端口號 -->
<port>80</port>
<!-- 項目訪問路徑-->
<path>/springmvc</path>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
- 或者在取值的時候,進行轉換。
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(name="name") String username) throws UnsupportedEncodingException {
System.out.println("執行了");
username = new String(username.getBytes("iso8859-1"), StandardCharsets.UTF_8);
System.out.println(username);
return "success";
}
四、解決地址欄中文參數亂碼
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body) throws UnsupportedEncodingException {
//uname=%E5%93%88%E5%93%88&age=11 --> uname=哈哈&age=11
System.out.println("執行了");
System.out.println(URLDecoder.decode(body, "utf-8"));
return "success";
}
可能地址欄中參數拼接的時候,值爲中文時,後臺接收到的是一串經過編碼的uicode字符。uname=%E5%93%88%E5%93%88&age=11
。這個也是比較容易解決的,因爲之前也遇到過,使用URLEncoder和URLDecoder兩個類可以實現編解碼。
五、在springmvc.xml中配置前端控制器哪些靜態資源不被攔截
我們在web.xml中的前端控制器配置:
<!--配置前端控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--加載類路徑下的springmvc.xml配置文件-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
在類路徑下springmvc.xml中的配置:
<!--配置前端控制器哪些靜態資源不攔截-->
<mvc:resources mapping="/js/**" location="/js/"></mvc:resources>
<mvc:resources mapping="/css/**" location="/css/"></mvc:resources>
<mvc:resources mapping="/images/**" location="/images/"></mvc:resources>
springmvc3.0之後可以直接使用下面的方法:
<mvc:default-servlet-handler></mvc:default-servlet-handler>
參考:
https://blog.csdn.net/caokang1314/article/details/47750267
https://www.cnblogs.com/dflmg/p/6393416.html
六、解決idea創建的maven項目右鍵new XMLconfiguration File沒有Spring config選項
問題產生的原因應該有許多,我這邊參考https://www.cnblogs.com/chenmingjun/p/10920813.html就成功解決:在pom.xml中引入支持:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
七、 Content type ‘application/json;charset=UTF-8’ not supported
說實話這個問題到最後都沒有解決,最後重新建了一個項目,步驟都一樣,結果成功了,也搞不清楚爲啥。但是這一路上倒是看到各種可能出現該情況的問題。在這裏列舉一下:
- 使用post協議提交時,如果希望用@RequestBody註解將json字符串自動綁定到pojo入參,類型需要是:
contentType: "application/json;charset=UTF-8",
。 - 缺少jackson-databind包,導入座標即可。
- 沒有使用@RequestBody註解,此時無法獲取請求體裏的參數信息,後臺接收的參數爲null。
八、Spring配置提示: File is included in 4 contexts
問題產生原因,配置文件沒有放在同一個ApplicationContext中。
解決辦法:參考https://blog.csdn.net/BFInWR/article/details/81015637
下面這個據說有用,但是我沒試過,先碼着: