Аспекты, которые не выполняются

105
11

Мы имеем аннотацию на функцию следующим образом:


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" />

спросил(а) 2014-11-20T21:52:00+03:00 6 лет, 3 месяца назад
1
Решение
75

Я создал простой проект со всей предоставленной вами информацией и не могу воспроизвести вашу проблему в простой настройке, поэтому у вас есть правильная реализация ваших beans/аспектов.

Одной из возможных и распространенных ошибок является определение аспекта в одном контексте и bean в другом, например, аспект определяется в applicationContext, а bean определяется в dispatcherServletContext. В такой конфигурации аспект не будет работать в beans, определенном в child dispatcherServletContext, только в родительском applicationContext

ответил(а) 2014-11-30T00:07:00+03:00 6 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема