我有一個通知服務(我可以控制這個類)。
如果有任何未經檢查的例外,那么我不想拋出它。但是想要以特定方式記錄它。
我可以直接在每個方法的實作中使用 try catch 塊,但我在這里尋找一些魔法??
有沒有一種通用的方法可以通過 Spring 來處理?
更新: AOP 也是一種方法。例如:https ://dzone.com/articles/handling-exceptions-using-springs-aop 任何其他直接實作?
這是我的要求,但我找不到與此相關的任何內容。
uj5u.com熱心網友回復:
在處理從 rest 服務呼叫多個 api 時,我遇到了類似的問題,我想在發生錯誤時提供一個后備實作。我Aspect的不僅僅是我在這里舉的例子。
服務
@Service
public class SuspiciousService {
final Random random = new Random();
public String beSuspicious() {
final boolean value = random.nextBoolean();
if (value) {
throw new IllegalStateException("Exception occured for: " value);
}
return "I am not suspicious";
}
}
隨機拋出錯誤的示例服務。
控制器
@RestController
@RequestMapping("/is-suspicious")
@AllArgsConstructor
public class SampleController {
private final SuspiciousService suspiciousService;
@GetMapping
public Map<String, String> get() {
return Map.of("isSuspicious", suspiciousService.beSuspicious());
}
}
呼叫此服務的控制器。
最后,Around Aspect捕獲此例外并提供示例回應。
@Aspect
@Component
@Order(2)
public class AspectAroundSuspiciousService {
@Around("execution(* in.silentsudo.sprintbootresttemplate.SuspiciousService.beSuspicious(..))")
public Object parallelExecuteBeforeAndAfterCompose(ProceedingJoinPoint point) throws Throwable {
try {
return point.proceed();
} catch (RuntimeException re) {
return "Yes, I am suspicious";
}
}
}
另一種方法是,如果您使用的是 ByteBuddy,則可以在拋出例外的方法中添加注釋
@Advice.OnMethodExit(onThrowable = RuntimeException.class)
并有一個 ExceptionHandler 來解決這個問題
@ExceptionHandler
private String suspiciousRuntimeException(RuntimeException exception) {
return "Yes, I am suspicious from ex handler, error: " exception.getMessage();
}
我選擇方面而不是 bytebuddy 的原因很簡單,因為我正在處理 api 例外的階梯,因為這個實作通常會從 service#method 中捕獲 RuntimeException
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/425725.html
上一篇:Hibernate使用地圖連接表
