文章目录
- 一、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
下面这个据说有用,但是我没试过,先码着: