2011-10-02 1 views
1

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

Ну это зависит от реализации @SendMail annotation.Take посмотреть на примере RequestForEnhancement в это [ссылка] (http://download.oracle.com/javase/1,5.0/docs/guide/language/annotations.html). Можете ли вы добавить информацию о @SendMail? – CoolBeans

+0

Да, я могу добавить детали. Я просмотрел ссылку, но все значения - это строка. Я хотел бы иметь доступ к другим членам и переменным экземпляра экземпляра или каким-то образом передавать требуемые значения в аннотацию. Но не уверен, есть ли способ сделать это – user373201

ответ

0

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

@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 

Чтобы зарегистрировать посоветуете в вашем applicationContext.xml написать это:

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

<bean id="adviseAspect" class="com.foo.acme.AOPSampleAdvice"/> 
Смежные вопросы