Java 8 Optional中未获取结果时的错误日志实现问题
解决Java 8 Optional orElseThrow中添加日志的问题
别担心,这个问题很好解决,核心是搞懂orElseThrow()的参数要求就行~你遇到报错是因为orElseThrow()需要接收一个Supplier<Throwable>类型的参数——简单说就是一个能返回异常对象的代码块,而不是直接执行一段无返回值的日志语句。下面给你两种纯Java 8风格的解决方案,不用回到传统的if判断写法:
方案一:在Lambda代码块中先打日志再抛异常
直接把日志操作和异常返回放在Lambda的大括号里,这样既执行了日志输出,又返回了符合要求的异常对象,完美适配Supplier的规则:
@PutMapping("/organs/{id}") public Organ updateorgan(@PathVariable(value = "id") Long organId, @Valid @RequestBody Organ organDetails) { Organ organ = organRepository.findById(organId) .orElseThrow(() -> { // 在这里正常打印错误日志 LOG.log(Level.SEVERE,"Organ with id "+organId + " not found"); // 最后返回异常对象 return new ResourceNotFoundException("organ", "id", organId); }); organ.setName(organDetails.getName()); Organ updatedOrgan = organRepository.save(organ); LOG.info("Updated organ details. Response :"+updatedOrgan); return updatedOrgan; }
方案二:封装成单独方法(代码更整洁)
如果这种“打日志+抛异常”的逻辑在多个地方用到,可以把它封装成一个私有方法,然后在Lambda里调用,让代码更简洁:
@PutMapping("/organs/{id}") public Organ updateorgan(@PathVariable(value = "id") Long organId, @Valid @RequestBody Organ organDetails) { Organ organ = organRepository.findById(organId) .orElseThrow(() -> handleOrganNotFound(organId)); organ.setName(organDetails.getName()); Organ updatedOrgan = organRepository.save(organ); LOG.info("Updated organ details. Response :"+updatedOrgan); return updatedOrgan; } // 封装的日志+异常处理方法 private ResourceNotFoundException handleOrganNotFound(Long organId) { LOG.log(Level.SEVERE,"Organ with id "+organId + " not found"); return new ResourceNotFoundException("organ", "id", organId); }
这两种方案都是纯Java 8的实现,完全符合你的要求,不用回到繁琐的if (optional.isPresent())传统写法。
内容的提问来源于stack exchange,提问作者I'm_Pratik
相关产品推荐
相关产品推荐

