1. 程式人生 > >spring boot restful api 方法引數 BindException 異常處理

spring boot restful api 方法引數 BindException 異常處理

 

客戶端 post json 資料,api 方法 接收的引數綁定出現異常,丟擲  BindException 異常,可以按照如下的方式處理

1、方法引數中增加 BindingResult 引數,通過 bindingResult.hasErrors()  判斷是否出錯

2、在 配置類中重寫 addFormatters 方法

@Configuration

public class MyWebAppConfigurer extends WebMvcConfigurerAdapter


@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {

	@Value("${home.page}")
	private String homePage;

	@Value("${spring.profiles.active}")
	private String env;

	@Bean
	public HttpMessageConverter<String> responseBodyConverter() {
		return new StringHttpMessageConverter(Charset.forName("UTF-8"));
	}
	
   @Override
    public void addFormatters(FormatterRegistry registry) {
	   	registry.addConverter(new StringtoDateConverter());
        super.addFormatters(registry);
    }

	@Override
	public void addViewControllers(ViewControllerRegistry registry) {
		registry.addViewController("/").setViewName("/index.html");
		registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
		super.addViewControllers(registry);
	}


	@Override
	public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

		FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
		FastJsonConfig config = new FastJsonConfig();
		config.setSerializerFeatures(SerializerFeature.WriteDateUseDateFormat,
				SerializerFeature.SkipTransientField, 
				SerializerFeature.WriteMapNullValue,
				SerializerFeature.WriteNullStringAsEmpty,
				SerializerFeature.WriteNullNumberAsZero);
		converter.setFastJsonConfig(config);
		converter.setDefaultCharset(Charset.forName("UTF-8"));
		
		super.configureMessageConverters(converters);
		converters.add(converter);
		converters.add(responseBodyConverter());

	}

	@Override
	public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
		configurer.favorPathExtension(false);
		super.configureContentNegotiation(configurer);
	}

	@Override
	public void configurePathMatch(PathMatchConfigurer configurer) {
		configurer.setUseSuffixPatternMatch(true).setUseTrailingSlashMatch(true);
	}


	@Override
	public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
		exceptionResolvers.add(new MyHandlerExceptionResolver());
	}


	
}

 

定義 StringtoDateConverter 類繼承 org.springframework.core.convert.converter.Converter 介面


@Component
public class StringToDateConverter implements Converter<String, Date> {

	private final Logger logger = LoggerFactory.getLogger(getClass());

	@Override
	public Date convert(String source) {
		if (StringUtils.isNotEmpty(source)) {
			try {
				if(source.matches("^\\d{4}-\\d{2}-\\d{2}[^\\r\\t]*")) {
					return DateUtil.parse(source);
				} else if(source.matches("^\\d+")) {
					Date d = new Date();
					d.setTime(Long.valueOf(source));
					return d;
				} else {
					logger.warn("日期引數錯誤:\"{}\"", source);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return null;
	}

}

 

目前按照 2 處理,這樣我就不用一個個方法來加引數 BindingResult 引數