Определите аннотацию, которая может быть применена к методам и классам. Если он применяется к классу, аннотация просто каскадируется и применяется ко всем методам в классе.
package com.perfectcomputersolutions.pos.annotation;
import org.springframework.stereotype.Component;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Component
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface NoNullArgs {
}
Затем создайте класс с советом (метод применения) для серии точечных разрезов (мест, где можно применить фактический совет). Примечание. Это пример, реализованный в Groovy, который просто проверяет, что все аргументы не равны NULL. Однако вы можете изменить тело метода так, чтобы оно делало все, что вы хотите. Если у вас есть массив args
, это те значения, которые вы можете привести к ожидаемому типу.
package com.perfectcomputersolutions.pos.aspect
import org.aspectj.lang.JoinPoint
import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.annotation.Before
import org.aspectj.lang.reflect.CodeSignature
import org.springframework.core.annotation.Order
import org.springframework.stereotype.Component
@Aspect
@Order(0)
@Component
class NoNullArgsAspect {
// Use this if writing in Java.
// omitting the getMetaClass call is only for Groovy
// @Before(
// value = "@within(com.perfectcomputersolutions.pos.annotation.NoNullArgs) || @annotation(com.perfectcomputersolutions.pos.annotation.NoNullArgs)"
// )
@Before(
value = "!execution(* *.getMetaClass(..)) && @within(com.perfectcomputersolutions.pos.annotation.NoNullArgs) || @annotation(com.perfectcomputersolutions.pos.annotation.NoNullArgs)"
)
void requireNotNull(JoinPoint jp) {
def method = (CodeSignature) jp.signature
def types = method.parameterTypes
def names = method.parameterNames
def args = jp.args
for (int i = 0; i < types.length; i++)
Objects.requireNonNull(args[i], "Parameter ${names[i]} must not be null" as String)
}
}