質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSF

JSF (JavaServer Faces)とは、JavaベースのWebアプリケーションフレームワークの一つです。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Q&A

1回答

6745閲覧

アノテーションとインターセプターを利用したログ出力で行の重複

tigetu

総合スコア10

JSF

JSF (JavaServer Faces)とは、JavaベースのWebアプリケーションフレームワークの一つです。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

0グッド

1クリップ

投稿2016/02/15 06:13

◇伺いたいこと
ログをファイルに出力すると、行が重複して出力されます。
原因や懸念点など、お気づきのことがあれば教えてください。

理想は行1,2,4,6のみ出力したいです。

行1:2016-02-15 13:21:07.578 [INFO] [116] LoggedInterceptor.logEntry (LoggedInterceptor.java:26) : ClassA#Method_A start 行2:2016-02-15 13:21:07.606 [INFO] [116] LoggedInterceptor.logEntry (LoggedInterceptor.java:26) : ClassB#Method_B start 行3:2016-02-15 13:21:07.606 [INFO] [116] LoggedInterceptor.logEntry (LoggedInterceptor.java:26) : ClassB#Method_B start 行4:2016-02-15 13:21:07.608 [INFO] [116] LoggedInterceptor.logEntry (LoggedInterceptor.java:33) : ClassB#Method_B end 行5:2016-02-15 13:21:07.608 [INFO] [116] LoggedInterceptor.logEntry (LoggedInterceptor.java:33) : ClassB#Method_B end 行6:2016-02-15 13:21:07.636 [INFO] [116] LoggedInterceptor.logEntry (LoggedInterceptor.java:33) : ClassA#Method_A end 行7:2016-02-15 13:21:07.636 [INFO] [116] LoggedInterceptor.logEntry (LoggedInterceptor.java:33) : ClassA#Method_A end

◇やりたいこと
参考ブログ
メソッドにアノテーションを付与してメソッドの開始と終了ログを記録したい。
logメソッドを直接呼びたくない理由はログ内容を実装者に依存せず、ミスを防ぐこと。

◇できていること
標準出力には想定の結果が表示されます

ClassA#Method_A start ClassB#Method_B start ClassB#Method_B end ClassA#Method_A end

◇環境
java1.8
EE7
JSF2.2
GlassFish4.1
ログ出力にJUL(java.util.logging.Logger)

◇コード
(アノテーション定義)

Java

1import java.lang.annotation.ElementType; 2import java.lang.annotation.Inherited; 3import java.lang.annotation.Retention; 4import java.lang.annotation.RetentionPolicy; 5import java.lang.annotation.Target; 6import javax.interceptor.InterceptorBinding; 7@Inherited 8@InterceptorBinding 9@Retention(RetentionPolicy.RUNTIME) 10@Target({ElementType.METHOD, ElementType.TYPE}) 11public @interface Logged { 12 13}

(アノテーション実装)

Java

1import cs.base.annotations.Logged; 2import java.io.Serializable; 3import java.util.logging.Level; 4import java.util.logging.Logger; 5import javax.annotation.Priority; 6import javax.inject.Inject; 7import javax.interceptor.AroundInvoke; 8import javax.interceptor.Interceptor; 9import javax.interceptor.InvocationContext; 10 11@Priority(Interceptor.Priority.LIBRARY_BEFORE) 12@Interceptor 13@Logged 14public class LoggedInterceptor implements Serializable{ 15 16 @Inject transient Logger logger; 17 18 @AroundInvoke 19 public Object logEntry(InvocationContext ic) throws Exception { 20 21 logger.log(Level.INFO, ic.getMethod().getDeclaringClass().getName() 22 + "#" 23 + ic.getMethod().getName() 24 + " start"); 25 Object obj = ic.proceed(); 26 logger.log(Level.INFO, ic.getMethod().getDeclaringClass().getName() 27 + "#" 28 + ic.getMethod().getName() 29 + " end"); 30 return obj; 31 } 32 33} 34

(呼び出しクラス)

Java

1@SessionScoped 2@Named 3public class ClassA implements Serializable{ 4 @EJB ClassB classB; 5 6 @Logged 7 public String Method_A() throws Throwable{ 8 classB.Method_B(); 9 } 10} 11 12@Stateless 13public class ClassB implements Serializable{ 14 @Logged 15 public void Method_B(){ 16 } 17}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Interceptorを使ったことが無いので自身が無いのですが、ご参考になればと思い回答いたします。
InterceptorアノテーションはメインClass(ソース)の単位で指定する用法のようです。

Java EEのCDIで定義しておくと便利なプロデューサーとインターセプター

ついては以下の様に1か所の定義とされてはどうでしょうか。

Java

1@SessionScoped 2@Named 3@Logged 4public class ClassA implements Serializable{ 5 @EJB ClassB classB; 6 7 public String Method_A() throws Throwable{ 8 classB.Method_B(); 9 } 10} 11 12@Stateless 13public class ClassB implements Serializable{ 14 public void Method_B(){ 15 } 16} 17

投稿2016/02/16 04:15

BlueMoon

総合スコア1339

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問