Аспекты, которые не выполняются
Мы имеем аннотацию на функцию следующим образом:
public class AnInterfaceImpl implements AnInterface {
@FairThreadUsageByEntity(entityName = "XYXYXYX",
numberOfThreads = 1)
public Report getReport(final String One, final String Two) {
//implementation.
}
}
public interface AnInterface {
String BEAN_NAME = "AnInterface"; //used for injection in spring.
Report getReport(final String One, final String two);
}
Spring Конфигурация:
<aop:aspectj-autoproxy />
<bean class="com.amazon.utils.fairthreadusage.aspect.FairThreadUsageByEntityAdvice" />
Аннотации реализованы как один из аспектов. Основная функциональность заключается в ограничении количества потоков, используемых определенным типом функциональности, скажем, загрузки. Ниже приведен код аннотации FairThreadUsageByEntity
:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface FairThreadUsageByEntity {
public String entityName();
public int numberOfThreads();
}
@Aspect
public class FairThreadUsageByEntityAdvice extends FairThreadUsageBase {
@Around("@annotation(fairUsage)")
public Object fairThreadUsageByEntity(final ProceedingJoinPoint pjp, final FairThreadUsageByEntity fairUsage)
throws Throwable {
//Implementation
}
}
Аннотация не работает. Я использую AspectJWeaver 1.7 и java 1.7.
Дайте мне знать, если что-то еще понадобится. Любая помощь была оценена.
EDIT: добавление контроллера, а также функция вызова getReport
public class ReportDownloadRootController extends BaseRootController {
public static final String REQUEST_MAPPING_REPORT_DOWNLOAD = "/hz/inventory/addproducts/status/report";
public static final String PARAM_REFERENCE_ID = "reference_id";
private AnInterface anInterface;
@RequestMapping(REQUEST_MAPPING_REPORT_DOWNLOAD)
public void execute(@RequestParam(value = PARAM_REFERENCE_ID, required = true) final String referenceId,
final HttpServletRequest request, final HttpServletResponse response) {
try {
Report report = AnInterface.getReport(referenceId, getContext().getMerchantId()); //breakpoint here
} catch {
//something
}
}
@Resource(name = AnInterface.BEAN_NAME)
public void setAnInterface(final AnInterface anInterface) {
this.anInterface = anInterface;
}
}
ИЗМЕНИТЬ 2: Spring bean для AnInterface
<bean id="AnInterface" class="com.facade.feed.AnInterfaceImpl" />
Я создал простой проект со всей предоставленной вами информацией и не могу воспроизвести вашу проблему в простой настройке, поэтому у вас есть правильная реализация ваших beans/аспектов.
Одной из возможных и распространенных ошибок является определение аспекта в одном контексте и bean в другом, например, аспект определяется в applicationContext
, а bean определяется в dispatcherServletContext
. В такой конфигурации аспект не будет работать в beans, определенном в child dispatcherServletContext
, только в родительском applicationContext