瑞吉外卖 day2

新增员工 

@PostMapping

public R<String> save(HttpServletRequest request,@RequestBody Employee employee){

log.info("新增员工,员工信息{}",employee);

//初始密码123456 进行md5加密

String ps = DigestUtils.md5DigestAsHex("123456".getBytes());

employee.setPassword(ps);

//LocalDateTime.now()获取当前系统时间

employee.setCreateTime(LocalDateTime.now());

employee.setUpdateTime(LocalDateTime.now());

employee.setCreateUser((Long) request.getSession().getAttribute("employee"));

employee.setUpdateUser((Long) request.getSession().getAttribute("employee"));

// try {

boolean save = employeeService.save(employee);

// } catch (Exception e){

// e.printStackTrace();

// return R.error("添加员工失败");

// }

return R.success("新增员工成功");

}

新增员工时可能出现id主键重复抛出的异常 可以使用 try catch捕获异常并返回 错误信息

或添加异常管理器进行全局捕获

@ControllerAdvice(annotations = {RestController.class, Controller.class})

@ResponseBody

@Slf4j

public class GlobalExceptionHandler {

/**

* 异常处理方法

* @return

*/

@ExceptionHandler(SQLIntegrityConstraintViolationException.class)

public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){

log.info(ex.getMessage());

if(ex.getMessage().contains("uplDicate entry")){

String[] s = ex.getMessage().split(" ");

return R.error("账号"+s[2]+"已存在");

}

return R.error("网络错误,请稍后重试!");

}

}

@ControllerAdive是设置捕获范围 annotations 是通过注解扫描

添加一个异常捕获器@ExceptionHandler(SQLIntegrityConstraintViolationException.class) 用来捕获SQLIntegrityConstraintViolationException 因为这种异常中可能含有不是主键异常的情况 所以通过异常信息中含有 uplDicate entry 来确认是主键冲突 然后通过按空格截断的方式来将异常信息装入String数组中 然后返回错误信息

异常信息:Duplicate entry 'heniang' for key 'idx_username

分頁

  • 页面发送ajax请求,将分页查询参数(page.pageSize、name)提交到服务端
  • 服务端Controller接收页面提交的数据并调用Service查询数据
  • Service调用Mapper操作数据库,查询分页数据
  • Controller将查询到的分页数据响应给页面
  • 页面接收到分页数据并通过ElementUI的Table组件展示到页面上

使用mp分頁需要配置分頁插件

@Configuration

public class MybatisPlusConfig {

@Bean//拦截器

public MybatisPlusInterceptor mybatisPlusInterceptor(){

MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();

mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());

return mybatisPlusInterceptor;

}

大体步骤new 一个mp拦截器 在将分页拦截器add

@GetMapping("/page")

public R<Page> page(int page,int pageSize,String name){

log.info("page={},pagesize={},name={}",page,pageSize,name);

//构造分页构造器

Page pageInfo = new Page(page,pageSize);

//构造条件构造器

LambdaQueryWrapper<Employee> queryWrapper =new LambdaQueryWrapper();

//添加条件 org.apache.commons.lang包下的StringUtils的isNotEmpty判断name是否为空

//当添加第二个查询条件(表的字段名)时需要先给上面条件构造器wrapper添加指定泛型

queryWrapper.like(StringUtils.isNotEmpty(name),Employee::getName,name).orderByDesc(Employee::getUpdateTime);

pageInfo = employeeService.page(pageInfo, queryWrapper);

return R.success(pageInfo);

}

启用/禁用员工账号

@PutMapping

public R<String> update(HttpServletRequest request,@RequestBody Employee employee){

log.info("emp+{}",employee);

employee.setUpdateUser((Long) request.getSession().getAttribute("employee"));

employee.setUpdateTime(LocalDateTime.now());

employeeService.updateById(employee);

return R.success("员工信息修改成功!");

}

在测试环节并没有报错 但是发现功能并未实现

通过debug发现是前端转向后端的Long型主键id发生丢失精度的问题

问题在于Long在传输时失去精度 解决问题的办法就是在服务端给页面响应json数据时统一对Long型数据转为String类型就可以解决

解决步骤

1、添加新的类

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)))



.addSerializer(BigInteger.class, ToStringSerializer.instance)

.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)));



//注册功能模块 例如,可以添加自定义序列化器和反序列化器

this.registerModule(simpleModule);

}

}

将Long型转为String类型 还有Time的格式的转换

再在WebMvcConfig的类中添加消息转换器并将其位置设置为0来替代Mvc自带的消息转换器

@Override

protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {

//创建消息转换器

MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();

messageConverter.setObjectMapper(new JacksonObjectMapper());

converters.add(0,messageConverter);

}

还可以在主键添加@JsonFormat(shape = JsonFormat.Shape.STRING)来解决问题

 //解决json Long类型主键从前端传到后端丢失精度的问题
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private Long id;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值