AspectJ + Servlets

Caros colegas;

Estou iniciando Programação Orientada a Aspectos com AspectJ.

Desenvolvi uma simples aplicação web que vou ilustrar abaixo:

[size=18]CÓDIGO DO SERVLET[/size]

[code]public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

public FirstServlet() {
    super();

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    processRequest(request,response);
}

private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //recebe a requisição
    String strNome ="testeNome";
    String strObs ="testeObs";
    
    strNome = request.getParameter("nome").toString();
    strObs = request.getParameter("obs").toString();
    
    System.out.println("SERVLET -- nome " + strNome + " obs " + strObs);
    
    request.setAttribute("nome", strNome);
    request.setAttribute("obs", strObs);

    RequestDispatcher view =  request.getRequestDispatcher("frmExibe.jsp");

    view.forward(request, response);
    //salva em um banco de dados
    //exibe em uma nova página o que foi salvo
    
}

}
[/code]

[size=18]CÓDIGO DO ASPECTO[/size]

[code]package myaspects;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public aspect XSSAspect {
@Override
pointcut p1() : execution (* .FirstServlet.process(…));

void around(HttpServletRequest request, HttpServletResponse response) : p1() && args(request,response){
    String strReq = request.getParameter("obs");
    strReq = strReq.replace("<script>", "");
    strReq = strReq.replace("</script>", "");
    strReq = strReq.replace("script", "");
    strReq = strReq.replace("\\", "");
    strReq = strReq.replace("/", "");
    strReq = strReq.replace("<","");
    strReq = strReq.replace(">","");
    strReq = strReq.replace("'java'","");
    System.out.println("executou aspecto");
    proceed(request,response);
}

}
[/code]

O que deveria ocorrer seria o aspecto interceptar a chamada do método [processRequest] do servlet. Como é um aspecto do tipo AROUND ele substitui a execução do método [processRequest], porém estou obtendo o seguinte erro:

[size=18]ERRO NO CONSOLE:[/size]

18/06/2009 10:56:11 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Allocate exception for servlet FirstServlet java.lang.ClassNotFoundException: org.aspectj.runtime.internal.AroundClosure at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233) at java.lang.ClassLoader.loadClassInternal(Unknown Source) at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Unknown Source) at java.lang.Class.getDeclaredMethods(Unknown Source) at org.apache.catalina.util.DefaultAnnotationProcessor.processAnnotations(DefaultAnnotationProcessor.java:162) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1119) at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:808) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:129) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Unknown Source)

[size=18]RETORNO EM UMA PÁGINA HTML[/size]

[code]HTTP Status 500 -


type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Error instantiating servlet class myservlet.FirstServlet
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
java.lang.Thread.run(Unknown Source)

root cause

java.lang.NoClassDefFoundError: org/aspectj/runtime/internal/AroundClosure
java.lang.Class.getDeclaredMethods0(Native Method)
java.lang.Class.privateGetDeclaredMethods(Unknown Source)
java.lang.Class.getDeclaredMethods(Unknown Source)
org.apache.catalina.util.DefaultAnnotationProcessor.processAnnotations(DefaultAnnotationProcessor.java:162)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
java.lang.Thread.run(Unknown Source)

root cause

java.lang.ClassNotFoundException: org.aspectj.runtime.internal.AroundClosure
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
java.lang.ClassLoader.loadClassInternal(Unknown Source)
java.lang.Class.getDeclaredMethods0(Native Method)
java.lang.Class.privateGetDeclaredMethods(Unknown Source)
java.lang.Class.getDeclaredMethods(Unknown Source)
org.apache.catalina.util.DefaultAnnotationProcessor.processAnnotations(DefaultAnnotationProcessor.java:162)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
java.lang.Thread.run(Unknown Source)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.18 logs.


Apache Tomcat/6.0.18
[/code]

[size=18]VERSÕES DAS PLATAFORMAS[/size]

  • Eclipse Ganymede
  • Eclipse AspectJ Development Tools

Version: 1.6.4.20090313172428
AspectJ version: 1.6.4.20090304172355

© Copyright IBM Corp. and others 2000, 2006. All rights reserved.
Visit http://www.eclipse.org/ajdt

Alguém poderia me ajudar?

É uma coisinha bem besta que também sofri no começo…

MSG Auto Explicativa

java.lang.ClassNotFoundException: org.aspectj.runtime.internal.AroundClosure

tem que colocar o jar aspectj.jar no lib da tua APP.

Pelo menos essa foi a unica maneira que consegui resolver este problema ai…

Fabiano;

estou usando o eclipse certo…?

quando eu descolapso o seguinte caminho:

[nome do meu projeto] \ Java Resources : src \ Libraries \ AspectJ Runtime Library

dentro desta pasta [AspectJ Runtime Library] já se encontra um item chamado [aspectjrt.jar].

É este o aspectj.jar do qual você citou em sua reposta?

Exato nessa pasta se encontra o Aspectj.jar

Porém na hora de exportar o projeto gerar um war ou coisa parecida. Ele não tava exportando esse jar. Dai joguei ele nas minha libs para ver o que acontecia. E voila tudo funcionou normalmente… Faça o teste e depois comente aqui…

Fabiano;

Peço a seguinte orientação sua:

Aonde (em que pasta) devo copiar e colar a biblioteca aspectj.jar?

no meu projeto tenho a seguinte estrutura de pastas e arquivos: (obs: o que está envolvido em colchetes são as pastas)
[nome do projeto]

  • [.settings]
  • [build]
  • [src]
  • [WebContent]
  • .classpath
  • .project

Desculpa a minha ignorância e agradecendo sua boa vontade.

bom tu deve ter alguma pasta com o Nome WEB-INF/lib

Cole o jar dentro da pasta lib…

Puxa vida… eu coloquei o arquivo aspectjrt.jar

na pasta:

C:\Documents and Settings\Pedro\workspace[b]JSPWithAspect[/b]\WebContent\WEB-INF[b]lib[/b]

Mas o erro continua acontecendo…

Será que eu não tenho que configurar algo especial no projeto eclipse, ou então copiar este arquivo JAR em algum lugar dentro do Apache Tomcat 6.0.18?

Um detalhe importante é que eu tenho o meu projeto convertido para um projeto aspect J

quando clicamos com o botão direito do mouse em cima do projeto, podemos escolher uma opção: Convert to AspectJ Project. No meu caso está selecionado.

Cara !!! RESOLVI !!!

Sabe como ?!!

Eu copiei o arquivo aspectjrt.jar na pasta do LIB do TOMCAT !!!

C:\Arquivos de programas[b]Apache Software Foundation\Apache Tomcat 6.0.18\lib[/b]

Obrigado FABIANO ! Com toda certeza não teria conseguido sem a sua ajuda !!!

É essa também é uma saida :smiley:

Mas a idéia é a mesma…