[英]How to throw Business Exception in Service using Spring AOP?
我在服务类中有一些自定义业务异常,我想创建一个目标方法异常注释来删除重复的代码,但我是 Spring AOP 的新手。 这是我的方法;
@Override
public GaDTO execute(String gId, Integer pN) {
Ga ga = repository.findById(gId);
if (ga == null){
throw new GaNotFoundException(gId);
}
if (ga.getIniVal().get(N_OF_P) <= pN){
throw new PNExceedLimitException(gId);
}
if ((PTEnum.P_1.equals(ga.getPT()) && ga.getP1().getP().get(pN).getS() == 0)
|| (PTEnum.P_2.equals(ga.getPT()) && ga.getP2().getP().get(pN).getS() == 0)){
throw new InPException(gId);
}
GaDTO gaDTO = gaMapper.toDTO(ga);
rls.forEach(rl -> rl.apply(gaDTO, pN));
repository.save(gaMapper.toEntity(gaDTO));
return gaDTO;
}
我想为GaNotFoundException 、 PNExceedLimitException和InPException创建注释。 我怎样才能做到这一点?
首先,您必须在 pom.xml 中添加spring-aop
依赖项。 这是maven依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
之后,您应该创建一个指向业务逻辑异常的注释。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BusinessLogicAnnotation {
}
然后你应该创建 Aspect 类来处理错误(如果存在)。 像下面
@Aspect
@Component
public class BusinessLogicAspect {
@Around("@annotation(BusinessLogicAnnotation)")
public Object businessLogicAspect(ProceedingJoinPoint joinPoint) throws Throwable {
Object proceed = joinPoint.proceed();
Ga ga = (Ga) proceed;
if (ga == null){
throw new GaNotFoundException(gId);
}
if (ga.getIniVal().get(N_OF_P) <= pN){
throw new PNExceedLimitException(gId);
}
if ((PTEnum.P_1.equals(ga.getPT()) && ga.getP1().getP().get(pN).getS() == 0)
|| (PTEnum.P_2.equals(ga.getPT()) && ga.getP2().getP().get(pN).getS() == 0)){
throw new InPException(gId);
}
return proceed;
}
}
最后,您应该使用我们创建的注释来注释存储库方法或服务方法。
@Repository
public interface GaRepository extends CrudRepository<Ga, UUID> {
@BusinessLogicAnnotation
Ga findByGaId(UUID id);
}
并简化您的服务逻辑:
@Override
public GaDTO execute(String gId, Integer pN) {
Ga ga = repository.findByGaId(gId);
GaDTO gaDTO = gaMapper.toDTO(ga);
rls.forEach(rl -> rl.apply(gaDTO, pN));
repository.save(gaMapper.toEntity(gaDTO));
return gaDTO;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.