瑞吉点餐 day02 技术点一: 配置数据重名异常拦截 技术点二: 前后端 Long 类型数值转换中的精度损失
day02
技术点一:
配置 数据重名异常 拦截:
当数据库 属性为唯一约束时, 重名异常 SQLIntegrityConstraintViolationException 会从 mapper 层逐层往上抛异常, 在controller 捕获异常,进行处理与判断
@RestControllerAdvice(annotations = {RestController.class, Controller.class})
@Slf4j
public class GlobalExeptionHandler {
// 捕获 不符数据库约束的异常
@ExceptionHandler(SQLIntegrityConstraintViolationException.class)
public R<String> handleSQLConExce(SQLIntegrityConstraintViolationException exception) {
String message = exception.getMessage();
// 确定 是重名异常
if (message.contains("Duplicate entry")) {
String[] msg = message.split(" ");
// 拿到 重名 返回给前端
String name = msg[2].replace("'", "");
return R.error(name + "已存在");
} else {
return R.error("数据异常");
}
}
}
技术点二:
前后端 Long 类型数值转换中的 精度损失
/* * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象 * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象] * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON] */ public class JacksonObjectMapper extends ObjectMapper { public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss"; public JacksonObjectMapper() { super(); //收到未知属性时不报异常 this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false); //反序列化时,属性不存在的兼容处理 this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); SimpleModule simpleModule = new SimpleModule()
.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
// DeserializerJSON 字符串------>JAVA 对象 // Serializer是JAVA 对象---->JSON 字符串
.addSerializer(BigInteger.class, ToStringSerializer.instance) //
将 LONG 类型的属性转换成 String 类型的数据写入JSON字符串并传给前端
.addSerializer(Long.class, ToStringSerializer.instance) .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
// 这一段设置了json 转JAVA 的日期格式 ,
// @JsonFormat(pattern="yyyy-MM-dd") 当实体类中的日期属性 转 JSON格式 没有配置到 时分秒 时 两者会冲突报错,
// 1.改进成@JsonFormat(pattern ="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
// 2.直接取消配置@JsonFormat
//注册功能模块 例如,可以添加自定义序列化器和反序列化器 this.registerModule(simpleModule); } }
并且在 WebMvcConfig 重写方法extendMessageConverters
/** * 扩展mvc框架的消息转换器 * @param converters */ @Override protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) { log.info("扩展消息转换器..."); //创建消息转换器对象 MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter(); //设置对象转换器,底层使用Jackson将Java对象转为json messageConverter.setObjectMapper(new JacksonObjectMapper()); //将上面的消息转换器对象追加到mvc框架的转换器集合中 converters.add(0,messageConverter); }

浙公网安备 33010602011771号