建立一個繼承於 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