Pergunta

Meu projeto é baseado no Spring Framework 2.5.4.E tento adicionar aspectos para alguns controladores (eu uso o Aspectj 1.5.3).

Habilitei o proxy automático em application-servlet.xml, apenas colei estas linhas no final do arquivo xml:

<aop:aspectj-autoproxy />
<bean id="auditLogProcessor" class="com.example.bg.web.utils.AuditLogProcessor" />

Aspecto criado:

package com.example.bg.web.utils;

import org.apache.log4j.Logger;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class AuditLogProcessor
{
    private final static Logger log = Logger.getLogger(AuditLogProcessor.class);

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))")
    public void afterHandleRequest() {
        log.info("test111");
    }

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))")
    public void afterRebuildThumbnail() {
        log.info("test222");
    }
}

Meus controladores:

class AssetAddController implements Controller
class AssetThumbnailRebuildController extends MultiActionController

Quando eu defini pontos de freio nos assessores de aspecto e invoco controladores, captura apenas depois de Mangust (), mas não após o AfterRebildthumbnail () o que eu fiz de errado?

OBSERVAÇÃO

Estou fazendo esta pergunta em nome de meu amigo que não tem acesso ao SO beta e não tenho ideia do que se trata.

EDITAR

De fato, houve alguns erros ortográficos, obrigado Cheekysoft.Mas o problema ainda persiste.

Foi útil?

Solução

Seus pontos de interrupção não estão sendo atingidos porque você está usando os proxies AOP do Spring.Ver compreensão-aop-proxies para obter uma descrição de como os Proxies AOP são especiais.

Basicamente, o framework MVC vai chamar o handleRequest método no proxy do seu controlador (que, por exemplo, o MultiActionController você está usando como implementos de classe base), esse método fará uma chamada "interna" para seu método reconstruirThumbnail, mas isso não passará pelo proxy e, portanto, não capturará nenhum aspecto.(Isso não tem nada a ver com o fato de os métodos serem finais.)

Para conseguir o que deseja, investigue o uso de AOP "real" por meio da tecelagem do tempo de carregamento (que o Spring suporta muito bem).

Outras dicas

AspectJ não funciona bem com classes na estrutura Spring Web MVC. Leia a parte inferior da caixa "Abrir para extensão..." no lado direito da página

Em vez disso, dê uma olhada no ManipuladorInterceptor interface.

As novas anotações do Spring MVC também podem funcionar, pois as classes Controller são todas POJOs, mas eu mesmo não tentei.

A configuração básica parece boa.

A sintaxe pode ser ligeiramente simplificada não definindo um pointcut no local e apenas especificando o método ao qual o conselho posterior deve ser aplicado.(Os pointcuts nomeados para métodos são criados automaticamente para você.)

por exemplo.

@After( "com.example.bg.web.controllers.assets.AssetAddController.handleRequest()" )
public void afterHandleRequest() {
    log.info( "test111" );
}

@After( "com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail()" )   
public void afterRebuildThumbnail() {
    log.info( "test222" );
}

Contanto que o método reconstruirThumbnail não seja final e o nome do método e a classe estejam corretos.Não vejo por que isso não funcionará.

ver http://static.springframework.org/spring/docs/2.0.x/reference/aop.html

Isso é tão simples quanto soletrar?ou há apenas erros de digitação na pergunta?Às vezes você escreve rebuildThumbnail e às vezes você escreve rebildThumbnail

Os métodos que você está tentando substituir com conselhos não são métodos finais na estrutura MVC, portanto, embora a resposta do bpapas seja útil, meu entendimento é que esse não é o problema neste caso.No entanto, certifique-se de que o rebuildThumbnail a ação do controlador não é final

@bpapas:Por favor me corrija se eu estiver errado.A ação do controlador do próprio programador é o que ele está tentando substituir.Olhando para a fonte MultiActionController (e seus pais), o único método finalizado potencialmente na pilha é MultiActionController.invokeNamedMethod, embora eu não tenha 100% de certeza se isso estaria na pilha naquele momento ou não.Ter um método finalizado no topo da pilha causaria um problema ao adicionar conselhos de AOP a um método mais abaixo?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top