Java отправить письмо с помощью аннотаций и AOP - PullRequest
1 голос
/ 03 октября 2011

Я хочу отправлять электронные письма, только если у них есть аннотация в методе с использованием Spring AOP. Но как мне получить значения в объектах с помощью аннотации. Например, у меня есть следующий метод. Используя AOP, я могу отслеживать, когда вызывается placeOrder. Но как мне получить номер заказа, адрес электронной почты пользователя и товары, заказанные по коду AOP.

@SendEmail()
public void placeOrder(){
    //ordernumber
    //user email address
    //items ordered
}

Возможно ли иметь объекты в аннотациях и методы могут устанавливать объекты. Например

@SendEmail(order=<order instance>, user=<user instance>, items=<list of item instance>)
public void placeOrder(){
    Order order;
    User user;
    List<Item> items;
}

1 Ответ

0 голосов
/ 25 мая 2012

в аннотации вы можете использовать только примитивы, String, Class, перечисления, аннотации и массивы предыдущих типов. Вы можете получить то же поведение, используя рекомендации АОП. Если вы хотите получить доступ к аргументам объектов метода или получить цель advise, вы можете написать советник, подобный этому:

@Aspect
public class AOPSampleAdvice {
.....
    @AfterReturning("execution(* *..YorServiceInterface.placeOrder(..))")
    public void afterReturning(JoinPoint joinPoint) {
                /*Use this if the order is passed in the method signature*/
        //Object[] args = joinPoint.getArgs();
        //Order order = (Order) args[0];
                /**/
        Object target = joinPoint.getTarget();
                List<Item> items = ((YorServiceInterface) target).getItems();
        User user = ((YorServiceInterface) target).getUser();
                //Your business
    }

Каждый раз, когда метод placeOrder вызывается при возврате этого метода, запускайте этот совет. Вы можете использовать:

@Before
@AfterReturning
@AfterThrowing
@After (finally)
@Around

Чтобы зарегистрировать этот совет в вашей заявке Kontext.xml, напишите:

<!-- enable aop -->
<aop:aspectj-autoproxy/>

<bean id="adviseAspect" class="com.foo.acme.AOPSampleAdvice"/>
...