Ich versuche, etwas ähnliches zu org.springframework.cache.annotation.Cacheable
verwenden:Pass Methode Argument in Richtung der benutzerdefinierte Anmerkung
Individuelle Anmerkung:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CheckEntity {
String message() default "Check entity msg";
String key() default "";
}
Richtung:
@Component
@Aspect
public class CheckEntityAspect {
@Before("execution(* *.*(..)) && @annotation(checkEntity)")
public void checkEntity(JoinPoint joinPoint, CheckEntitty checkEntity) {
System.out.println("running entity check: " + joinPoint.getSignature().getName());
}
}
Service:
@Service
@Transactional
public class EntityServiceImpl implements EntityService {
@CheckEntity(key = "#id")
public Entity getEntity(Long id) {
return new Entity(id);
}
}
Meine IDE (IntelliJ) sieht nichts Besonderes mit der Verwendung key = "#id"
im Gegensatz zu ähnlichen Verwendungen für Cacheable
, wo es mit anderer Farbe als Klartext angezeigt wird. Ich erwähne den IDE-Teil nur als einen Hinweis für den Fall, dass es hilft, es sieht so aus, als wäre die IDE im Voraus über diese Anmerkungen informiert oder sie realisiert nur eine Verbindung, die in meinem Beispiel nicht existiert.
Der Wert in checkEntity.key ist '#id' anstelle einer erwarteten Zahl. Ich versuchte mit ExpressionParser
aber möglicherweise nicht in der richtigen Weise.
Die einzige Möglichkeit, Parameterwert innerhalb der checkEntity-Annotation zu erhalten, ist der Zugriff auf das Array arguments, das nicht das ist, was ich möchte, da diese Annotation auch in Methoden mit mehr als einem Argument verwendet werden könnte.
Irgendeine Idee?
Keine IDE kann Ihnen kontextbezogene Unterstützung für @ @ Cacheable bieten, da Ihr Aspekt maßgeschneidert ist. Kann ich fragen, welche Art von Funktionalität Sie mit Ihrem Aspekt zu bieten versuchen? Versuchen Sie zu überprüfen, ob eine Entität bereits existiert? – geoand
Dies ist zu überprüfen, ob diese ID (sagen AbteilungId) in eingeloggten Benutzerabteilungen vorhanden ist, auf die sie zugreifen können, eine accessdenied Ausnahme werfen – Chris
Würde nicht Spring Security oder Apache Shiro solche Funktionen bieten, ohne eigene Implementierung rollen zu müssen? – geoand