我是靠谱客的博主 野性书本,最近开发中收集的这篇文章主要介绍spring的一些自定义配置(web层相关)通过WebMvcConfigurer接口自定义Spring配置全局异常的自定义处理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

通过WebMvcConfigurer接口自定义Spring配置

代码如下

import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import java.util.List;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@PropertySource("classpath:baseWeb.properties")
public class BaseConfigs implements WebMvcConfigurer {
/**
* long转String防止精度丢失
*/
@Bean("jackson2ObjectMapperBuilderCustomizer")
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return jacksonObjectMapperBuilder ->
jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance)
.serializerByType(Long.TYPE, ToStringSerializer.instance);
}
/**
* RowBounds 不传的时候,认为offset 0
limit 20
*/
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new RowBoundsMethodArgumentResolver());
}
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new StringToDateConverter());
}
}

1.jackson2ObjectMapperBuilderCustomizer方法(针对请求体,long转String防止精度丢失)

这个方法通过注入一个Jackson2ObjectMapperBuilderCustomizer类,实现了Long类型返回精度丢失的问题,前端的的number类型只能接收17位,后端需要转换为String类型返回

2.addArgumentResolvers方法(添加自定义参数解析器,针对请求参数)

这个方法是用来添加自定义方法参数处理器的,自定义一个类(RowBoundsMethodArgumentResolver)实现HandlerMethodArgumentResolver接口,HandlerMethodArgumentResolver接口的两个方法的作用:
(1) supportsParameter方法 用于判断是否支持对某种参数的解析
(2) resolveArgument方法 将请求中的参数值解析为某种对象
代码如下

import com.google.common.base.Strings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
public class RowBoundsMethodArgumentResolver implements HandlerMethodArgumentResolver {
private static final Logger LOGGER = LoggerFactory.getLogger(RowBoundsMethodArgumentResolver.class);
private static final int DEFAULT_OFFSET = 0;
private static final int DEFAULT_LIMIT = 20;
@Override
public boolean supportsParameter(MethodParameter parameter) {
return RowBounds.class.equals(parameter.getParameterType());
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
String offsetString = webRequest.getParameter("offset");
String limitString = webRequest.getParameter("limit");
int offset = DEFAULT_OFFSET;
int limit = DEFAULT_LIMIT;
if (!Strings.isNullOrEmpty(offsetString)) {
try {
offset = Integer.valueOf(offsetString);
} catch (NumberFormatException e) {
LOGGER.error("Invalid offset '{}': {}", offsetString, e.getMessage());
}
}
if (!Strings.isNullOrEmpty(limitString)) {
try {
limit = Integer.valueOf(limitString);
} catch (NumberFormatException e) {
LOGGER.error("Invalid limit '{}': {}", limitString, e.getMessage());
}
}
offset = offset >= 0 ? offset : DEFAULT_OFFSET;
limit = limit >= 1 ? limit : DEFAULT_LIMIT;
return new RowBounds(offset, limit);
}
}

3.addFormatters方法(注册自定义的Formatter和Convert,针对请求参数)

这个方法是用来添加自定义类转换器的,自定义一个类(StringToDateConverter)实现Converter<S,T>接口,Converter<S,T>接口的方法的作用:
(1) convert方法 将S类的对象转换成T类的对象返回
代码如下:

import com.fasterxml.jackson.databind.util.StdDateFormat;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
import org.springframework.core.convert.converter.Converter;
public class StringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
DateFormat formatter = new StdDateFormat();
try {
return formatter.parse(source);
} catch (ParseException ex) {
throw new IllegalArgumentException("时间格式错误,期望格式[yyyy-MM-dd|yyyyMMdd][T(hh:mm[:ss[.sss]]|hhmm[ss[.sss]])]?[Z|[+-]hh[:]mm]]");
}
}
}

关于请求参数的转换过程参照这篇文章 :详解Spring MVC中不同格式的POST请求参数的数据类型转换过程

全局异常的自定义处理

接口如果发生异常,统一返回自定义的异常信息(ErrorMessage类)
代码如下:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.core.annotation.Order;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
@ControllerAdvice
@Order()
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ErrorMessage handleError(HttpServletRequest req, Exception ex) {
ErrorMessage errorMessage = new ErrorMessage();
//自定义处理
return errorMessage;
}
}

@ControllerAdvice注解代表本类作用于所有被 @Controller标注的Controller类
@ExceptionHandler注解作用于所有@RequestMapping标注的方法抛出的指定类型的异常
@Order注解代表执行的优先级
ErrorMessage为自定义的返回类

最后

以上就是野性书本为你收集整理的spring的一些自定义配置(web层相关)通过WebMvcConfigurer接口自定义Spring配置全局异常的自定义处理的全部内容,希望文章能够帮你解决spring的一些自定义配置(web层相关)通过WebMvcConfigurer接口自定义Spring配置全局异常的自定义处理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部