2017-02-01 9 views
0

私のアプリケーションのロギングシステムにSpring AOPを使用しています。しかし、私はそれにいくつかの問題があります。Spring AOPが動作しない

私は単純なクラスMessageReceiverImpl

@Aspect 
public class LoggerMessage { 

    private static final Logger log = Logger.getLogger("listenerLogger"); 

    @Before("execution(* server.logic.listener.message.MessageReceiverImpl.receive(..))") 
    public void logMessageReceiver() { 
     log.info("INFO : LoggerMessage -> new Client"); 
    } 
} 

ためpiontcutと

@Component 
@Scope(BeanDefinition.SCOPE_PROTOTYPE) 
public class MessageReceiverImpl implements MessageReceiver { 
    final private BufferedReader reader; 

    public MessageReceiverImpl(BufferedReader reader) { 
     this.reader = reader; 
    } 
    public String receive(){ 
     String msg = null; 
     try { 
      msg = reader.readLine(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return msg; 
    } 
} 

そしてLoggerクラスそして、私のbean.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:aop="http://www.springframework.org/schema/aop" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> 

    <aop:aspectj-autoproxy> 
     <aop:include name="loggerMessage"/> 
    </aop:aspectj-autoproxy> 
    <aop:aspectj-autoproxy proxy-target-class="true"/> 

    <!-- Aspect --> 
    <bean id="loggerMessage" class="service.logger.listener.LoggerMessage" /> 

</beans> 

を持っている。しかし、実行が受け取る前に、それは動作しません。 () 方法。その他のLogクラスはうまく動作します。どこに問題がありますか?

詳細情報あなたは豆の作成の設定をいじっているよう

public class UploadSessionImpl implements UploadSession,  ApplicationContextAware { 

private MessageReceiver receiver; 

public UploadSessionImpl(Socket socket) throws IOException { 
    this.socket = socket; 
} 

public void process() throws IOException { 
    String msg; 

    while (true) { 
     msg = receiver.receive(); 
     if (msg.equals("close")) break; 
     ... 
    } 
} 
+0

削除する必要がある「aop:aspectj-autoproxy」のエントリが重複しています。 'proxy-target-class =" true "' –

+0

としてください。そして、 'MessageRecieverImpl'クラスのインスタンスをどうやって作りますか?この設定はどのようにロードされますか?あまり情報がありません...スニペットだけでなく、これを再現するサンプルを提供してください。 –

+0

@M。 Deinum私はさらにいくつかの情報を追加しました –

答えて

0

@Bean 
@Scope(BeanDefinition.SCOPE_PROTOTYPE) 
UploadSession getSession(Socket socket) { 
    UploadSessionImpl uploadSession = null; 
    try { 
     uploadSession = new UploadSessionImpl(socket); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     MessageReceiver receiver = new MessageReceiverImpl(reader); 
     uploadSession.setReceiver(receiver); 

     PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
     MessageSender sender = new MessageSenderImpl(out); 
     uploadSession.setSender(sender); 

     uploadSession.setBaseDir(context.getEnvironment().getProperty("listener.test-runs-folder")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return uploadSession; 
} 

instatnce作成使用すると、これまでのところ、あなたのコードから、見えます。

@Bean 
    @Scope(BeanDefinition.SCOPE_PROTOTYPE) 
    public BufferedReader bufferedReader(Socket socket) throws Exception { 
     return new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    } 

    @Bean 
    @Scope(BeanDefinition.SCOPE_PROTOTYPE) 
    public MessageReceiver receiver(BufferedReader bufferedReader) { 
     return new MessageReceiverImpl(bufferedReader); 
    } 

    @Bean 
    @Scope(BeanDefinition.SCOPE_PROTOTYPE) 
    UploadSession getSession(Socket socket, MessageReceiver receiver) { 
     UploadSessionImpl uploadSession = null; 
     try { 
      uploadSession = new UploadSessionImpl(socket); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      uploadSession.setReceiver(receiver); 

      PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
      MessageSender sender = new MessageSenderImpl(out); 
      uploadSession.setSender(sender); 

      uploadSession.setBaseDir(context.getEnvironment().getProperty("listener.test-runs-folder")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return uploadSession; 
    } 
関連する問題