Jak zmodyfikować atrybuty zwróconego obiektu za pomocą AspectJ?
Mam klasę, która wygląda następująco (z Spring Roo DataOnDemand), która zwraca nowy obiekt przejściowy (nie utrwalony) do użycia w testowaniu jednostkowym. Oto jak wygląda kod po wykonaniu push-up z ITD Spring Roo.
public class MyObjectOnDemand {
public MyObjectOnDemand getNewTransientObject(int index) {
MyObjectOnDemand obj = new MyObjectOnDemand();
return obj;
}
}
To, co muszę zrobić, to wykonać dodatkowe wywołania na zwróconym odwołaniu do obiektu, aby ustawić dodatkowe pola, o które nie radzi sobie automatycznie generowana metoda Spring Roo. Więc bez modyfikowania powyższego kodu (lub wciskając go z ITD Roo), chcę wykonać jedno dodatkowe połączenie:
obj.setName("test_name_" + index);
Aby to zrobić, zadeklarowałem nowy aspekt, który ma właściwy punkt odniesienia i który doradzi konkretną metodę.
public aspect MyObjectDataOnDemandAdvise {
pointcut pointcutGetNewTransientMyObject() :
execution(public MyObject MyObjectDataOnDemand.getNewTransientObject(int));
after() returning(MyObject obj) :
pointcutGetNewTransientMyObject() {
obj.setName("test_name_" + index);
}
}
Teraz, zgodnie z Eclipse, pointcut jest napisany poprawnie i zaleca właściwą metodę. Wydaje się jednak, że nie dzieje się tak, ponieważ testy integracyjne, które trwają obiekt, nadal nie działają, ponieważ atrybut name jest wymagany, ale nie jest ustawiany. I zgodnie z AspectJ Manninga w Akcji (sekcja 4.3.2) rada następcza powinna mieć możliwość modyfikowania wartości zwracanych. Ale może zamiast tego muszę poradzić sobie z ()?