Springboot接收时间参数
在工作中,前后分离情况下,我们前端给我们的参数中携带的是时间参数,比如yyyy-MM-dd HH:mm:ss,那我们的实体却是date类型,那肯定对应不上,会报错。我们该怎么解决时间参数问题呢?
直接给大家说终极解决方案,就是采用ObjectMapper,全局拦截转换。
下面就是具体的代码实现:
/**
* 日期转换配置
* 解决@RequestAttribute、@RequestParam和@RequestBody三种类型的时间类型参数接收与转换问题
*/
@Configuration
public class DateConfig {
/**
* 默认日期时间格式
*/
public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
/**
* Json序列化和反序列化转换器,用于转换Post请求体中的json以及将我们的对象序列化为返回响应的json
* 使用@RequestBody注解的对象中的Date类型将从这里被转换
*/
@Bean
public ObjectMapper objectMapper(){
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
JavaTimeModule javaTimeModule = new JavaTimeModule();
//Date序列化和反序列化
javaTimeModule.addSerializer(Date.class, new JsonSerializer<Date>() {
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
SimpleDateFormat formatter = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT);
String formattedDate = formatter.format(date);
jsonGenerator.writeString(formattedDate);
}
});
javaTimeModule.addDeserializer(Date.class, new JsonDeserializer<Date>() {
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
return new DateConverter().convert(jsonParser.getText());
}
});
objectMapper.registerModule(javaTimeModule);
return objectMapper;
}
}
这里解决了json格式传递过来的参数问题,但是我们@RequestAttribute、@RequestParam这些参数怎么办?其实是有办法解决的。
@ControllerAdvice
public class ControllerHandler {
private Logger logger = LoggerFactory.getLogger(ControllerHandler.class);
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(new DateConverter().convert(text));
}
});
}
}
public class DateConverter implements Converter<String, Date> {
private Logger logger = LoggerFactory.getLogger(DateConverter.class);
private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";
private static final String shortDateFormat = "yyyy-MM-dd";
private static final String timeStampFormat = "^\d+$";
@Override
public Date convert(String value) {
logger.info("转换日期:" + value);
if(value == null || value.trim().equals("") || value.equalsIgnoreCase("null")) {
return null;
}
value = value.trim();
try {
if (value.contains("-")) {
SimpleDateFormat formatter;
if (value.contains(":")) {
formatter = new SimpleDateFormat(dateFormat);
} else {
formatter = new SimpleDateFormat(shortDateFormat);
}
return formatter.parse(value);
} else if (value.matches(timeStampFormat)) {
Long lDate = new Long(value);
return new Date(lDate);
}
} catch (Exception e) {
throw new RuntimeException(String.format("parser %s to Date fail", value));
}
throw new RuntimeException(String.format("parser %s to Date fail", value));
}
}
我们需要的是实现Converter,把参数string类型转换为date类型即可。
就这样,在我们实际开发过程中,我们就不用担心时间参数问题导致的异常。
欢迎大家关注我