繁体   English   中英

如何使用 Spring AOP 在服务中抛出业务异常?

[英]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;
}

我想为GaNotFoundExceptionPNExceedLimitExceptionInPException创建注释。 我怎样才能做到这一点?

首先,您必须在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM