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

相关文章
相关标签/搜索