spring 處理記錄

1、ResponseBody註解,對象轉json格式化

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

 

2、ResponseBody註解,接口直接返回String防止亂碼

上面的 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>

 

3、ControllerAdvice註解使用,主要是搭配ExceptionHandler註解,處理異常

@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

 

4、簡單的實現40四、405的攔截

這裏用到的主要有兩點,一是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

相關文章
相關標籤/搜索