瑞吉点餐 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);
  }
posted @ 2022-03-17 21:37  twb_QAQZ  阅读(123)  评论(0)    收藏  举报