建立一个继承于 ObjectMapper 的对象java
import java.text.DateFormat; import java.text.SimpleDateFormat; import org.springframework.util.StringUtils; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.fasterxml.jackson.databind.SerializationFeature; /** * Json转换配置 * @author Administrator * */ public class CustomObjectMapper extends ObjectMapper { private static final long serialVersionUID = 1L; private boolean camelCaseToLowerCaseWithUnderscores = false; private String dateFormatPattern; public void setCamelCaseToLowerCaseWithUnderscores( boolean camelCaseToLowerCaseWithUnderscores) { this.camelCaseToLowerCaseWithUnderscores = camelCaseToLowerCaseWithUnderscores; } public void setDateFormatPattern(String dateFormatPattern) { this.dateFormatPattern = dateFormatPattern; } public void init() { // 排除值为空属性 setSerializationInclusion(JsonInclude.Include.NON_NULL); // 进行缩进输出 configure(SerializationFeature.INDENT_OUTPUT, true); // 将驼峰转为下划线 if (camelCaseToLowerCaseWithUnderscores) { setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); } // 进行日期格式化 if (!StringUtils.isEmpty(dateFormatPattern)) { DateFormat dateFormat = new SimpleDateFormat(dateFormatPattern); setDateFormat(dateFormat); } } }
在 spring-mvc.xml 中修改web
<context:component-scan base-package="com.vacomall"></context:component-scan> <bean id="objectMapper" class="com.vacomall.jackson.CustomObjectMapper" init-method="init"> <property name="camelCaseToLowerCaseWithUnderscores" value="true"/> <property name="dateFormatPattern" value="yyyy-MM-dd HH:mm:ss"/> </bean> <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" > <property name="objectMapper" ref="objectMapper"/> </bean> </mvc:message-converters> </mvc:annotation-driven>
上面的 Object 转换器使用的是 utf-8 编码因此不会出现乱码问题,而String转换器使用的是 ISO-8859-1 因此会出现问题spring
org.springframework.http.converter.StringHttpMessageConverter
直接找到上面的这个类,他是处理 String 返回的转换器,复制这个类并重命名,而后修改其中的默认编码json
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
改成 utf-8,以后修改 spring-mvc.xml 中启用注解的标签,UTF8StringHttpMessageConverter 就是重命名以后的名称spring-mvc
<!-- 配置注解驱动 --> <!--<mvc:annotation-driven/>--> <mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="yourPackage.UTF8StringHttpMessageConverter"/> </mvc:message-converters> </mvc:annotation-driven>
11-29改
看到了一个更简单的方法,能够直接使用标签修改 StringHttpMessageConverter 的默认编码mvc
<!-- 配置注解驱动 --> <!--<mvc:annotation-driven/>--> <mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <!-- 将StringHttpMessageConverter的默认编码设为UTF-8 --> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value="UTF-8" /> </bean> </mvc:message-converters> </mvc:annotation-driven>
@ControllerAdvice @ResponseBody public class ExceptionAdvice { /** * 请求地址不存在 404 */ @ResponseStatus(HttpStatus.NOT_FOUND) @ExceptionHandler(NoHandlerFoundException.class) public String noHandlerFoundException(){ System.out.println("该接口不存在"); return new Result(0,"100404","该接口不存在").toString(); } /** * 请求方式不支持 405 */ @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) @ExceptionHandler(HttpRequestMethodNotSupportedException.class) public String httpRequestMethodNotSupportedException(){ return new Result(0,"100405","不支持当前请求方法").toString(); } }
只要将上面的方法加入扫描的包中就能够,app
可是有一个问题,404是不能实现拦截的,就原理来讲 ControllerAdvice 注解是对 controller 的加强,针对的是 RequestMapping 注解,而404就是不存在 RequestMapping 注解,因此也就没地方拦截,可是网上不少人都是这么写的不清楚怎么实现。this
这里用到的主要有两点,一是web自带的异常拦截标签 <error-page> ,二是spring的地址拦截器,首先要保证拦截其能够拦截到<error-page> 中的地址,编码
<!-- spring 上下文监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- web自带异常拦截 --> <error-page> <error-code>404</error-code> <location>/404</location> </error-page> <error-page> <error-code>405</error-code> <location>/405</location> </error-page>
/** * 主要是404,405异常的处理 * * @author ThreeFeng * @create 2016-11-28 14:59 */ @Controller public class ExceptionController { @RequestMapping("404") @ResponseBody public String error404(){ return new Result(0,"100404","该接口不存在").toString(); } @RequestMapping("405") @ResponseBody public String error405(){ return new Result(0,"100405","不支持当前请求方法").toString(); } }
这样的方法也就能够实现404和405这类请求异常的拦截url