Java自定义注解的实现,总共三步(eg.@RandomlyThrowsException):
1.首先编写一个自定义注解@RandomlyThrowsException
package com.github.prontera; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface RandomlyThrowsException {
}
2.编写自定义注解@RandomlyThrowsException的实现
package com.github.prontera.aspect; import com.github.prontera.config.ManualExceptionProperties;
import com.github.prontera.exception.ManualException;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.Ordered; import java.security.SecureRandom;
import java.util.Random; @Aspect
public class ManualExceptionAspect implements Ordered {
private final int order;
private final ManualExceptionProperties properties;
private static final Random RANDOM = new SecureRandom(); public ManualExceptionAspect(int order, ManualExceptionProperties properties) {
this.order = order;
this.properties = properties;
} @Around("@annotation(com.github.prontera.RandomlyThrowsException)")
public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {
if (properties.isEnabled()) {
if (RANDOM.nextInt(100) % properties.getFactor() == 0) {
throw new ManualException("manual exception");
}
}
return joinPoint.proceed();
} @Override
public int getOrder() {
return order;
}
}
3.使用自定义注解@RandomlyThrowsException
@Delay
@RandomlyThrowsException
@ApiOperation(value = "下单", notes = "生成预订单")
@RequestMapping(value = "/orders", method = RequestMethod.POST)
public ObjectDataResponse<Order> placeOrder(@Valid @RequestBody PlaceOrderRequest request, BindingResult result) {
return orderService.placeOrder(request);
}