AspectJ + Servlets

8 respostas
pedroabs

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]

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
        
    }

}

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

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);
    }
}

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]

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

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

- Eclipse Ganymede
- Eclipse AspectJ Development Tools

Version: 1.6.4.20090313172428
AspectJ version: 1.6.4.20090304172355

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

Alguém poderia me ajudar?

8 Respostas

fabianofrizzo

É 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…

pedroabs

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?

fabianofrizzo

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…

pedroabs

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.

fabianofrizzo

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

Cole o jar dentro da pasta lib…

pedroabs

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.

pedroabs

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 !!!

fabianofrizzo

É essa também é uma saida :smiley:

Mas a idéia é a mesma…

Criado 18 de junho de 2009
Ultima resposta 18 de jun. de 2009
Respostas 8
Participantes 2