Como modificar os atributos de um objeto retornado usando AspectJ?
Eu tenho uma classe que se parece com o seguinte (do Spring Roo DataOnDemand), que retorna um novo objeto transitório (não persistente) para uso no teste de unidade. É assim que o código se parece depois que fazemos um push-in do ITD do Spring Roo.
public class MyObjectOnDemand {
public MyObjectOnDemand getNewTransientObject(int index) {
MyObjectOnDemand obj = new MyObjectOnDemand();
return obj;
}
}
O que eu preciso fazer é fazer chamadas adicionais na referência do objeto retornado para definir campos adicionais que o método gerado automaticamente pelo Spring Roo não está cuidando. Então, sem modificar o código acima (ou empurrá-lo do ITD do Roo), eu quero fazer uma chamada adicional:
obj.setName("test_name_" + index);
Para fazer isso, eu declarei um novo aspecto que possui o pointcut apropriado e que irá aconselhar o método específico.
public aspect MyObjectDataOnDemandAdvise {
pointcut pointcutGetNewTransientMyObject() :
execution(public MyObject MyObjectDataOnDemand.getNewTransientObject(int));
after() returning(MyObject obj) :
pointcutGetNewTransientMyObject() {
obj.setName("test_name_" + index);
}
}
Agora, de acordo com o Eclipse, o pointcut está escrito corretamente e está aconselhando o método correto. Mas isso não parece estar acontecendo porque os testes de integração que persistem no objeto ainda estão falhando porque o atributo name é obrigatório, mas não está sendo definido. E de acordo com AspectJ de Manning em Ação (seção 4.3.2), o conselho posterior deve ser capaz de modificar os valores de retorno. Mas talvez eu precise fazer um conselho ao redor?