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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

2回答

3433閲覧

【Spring boot + AspectJ】実行対象クラス内の@Autowiredが機能しない

koronatail

総合スコア433

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2018/10/17 06:52

編集2018/10/17 08:40

前提・実現したいこと

AspectJを使って、各Controllerが呼び出されたときにログを出力したいと考えています。
@RequestMappingを指定しているメソッドを対象にしたAspectクラスを作ってみたのですが、
いざアクセスしてみるとController内で@Autowiredを指定している変数がnullになってしまいました

該当のソースコード

Aspect

java

1@Aspect 2@Component 3public class ControllerLoggerAspect { 4 @Around("@annotation(org.springframework.web.bind.annotation.RequestMapping)") 5 public Object around(ProceedingJoinPoint jp) { 6 System.out.println("[Around]===================================="); 7 Object result = null; 8 try { 9 // 対象メソッド実行 10 result = jp.proceed(); 11 System.out.println("[Around]args:" + Arrays.toString(jp.getArgs())); 12 System.out.println("[Around]signature:" + jp.getSignature()); 13 System.out.println("[Around]return:" + result); 14 } catch (Throwable throwable) { 15 throwable.printStackTrace(); 16 } 17 return result; 18 } 19}

Controller

java

1@Controller 2public class TestController { 3 @Autowired 4 private ManagementService managerService; ///testにアクセスした際これがnullだった 5 @RequestMapping(value = {"/test"}) 6 public final ModelAndView testLogin( 7 final HttpServletRequest request) { 8 final ModelAndView mav = new ModelAndView(); 9 managerService.hogehoge();///testにアクセスした際にここでnullpointer exception 10 return mav; 11 } 12}

Service

java

1@Service 2public class ManagementServiceImpl implements ManagementService { 3 @Override 4 public void hogehoge() { 5 //いろいろ処理 6 } 7}

細かいところは省略していますがおおよそ上記のとおりです。
ControllerLoggerAspectの@Componetを外すと、/testに正常にアクセスでき、nullpointer exceptionも発生しませんが、
ControllerLoggerAspect内のメソッドが呼び出されませんでした。
何か思い当たることがあれば回答いただければと思います。

追記
WebSecurityConfigに@AspectJAutoProxyというのがついていなかったのでつけてみましたが特に何も変わらなかったので消しなおしました
17:07 @RequestMappingのついたtestLoginメソッドが、@Aroundのついたaroundメソッドよりも先に呼ばれていました。
17:11 次のメソッドをAspectクラスに追加したばあいも、Controllerが先に呼び出されていました

java

1@Before("@annotation(org.springframework.web.bind.annotation.RequestMapping)") 2 public void beforeController(JoinPoint jp) { 3 System.out.println("before !!"); 4 }

17:39 上記のケースで呼び出されていたのは500エラー発生時のControllerでした。testLoginメソッドが呼ばれた場合には前後でまったく呼ばれていませんでした。

バージョン情報

Spring MVC 4.2.7
Spring Boot 1.3.6
Aspectj 1.8.9
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop/1.3.6.RELEASE

POM

xml

1<?xml version="1.0" encoding="UTF-8"?> 2<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 6 <groupId>testtest</groupId> 7 <artifactId>testtest</artifactId> 8 <name>testtest</name> 9 <url>http://maven.apache.org</url> 10 <description>project for Spring Boot</description> 11 12 <parent> 13 <groupId>org.springframework.boot</groupId> 14 <artifactId>spring-boot-starter-parent</artifactId> 15 <version>1.3.6.RELEASE</version> 16 </parent> 17 18 <dependencies> 19 <dependency> 20 <groupId>org.springframework.boot</groupId> 21 <artifactId>spring-boot-starter-data-jpa</artifactId> 22 </dependency> 23 <dependency> 24 <groupId>org.springframework.boot</groupId> 25 <artifactId>spring-boot-starter-jdbc</artifactId> 26 </dependency> 27 <dependency> 28 <groupId>org.springframework.boot</groupId> 29 <artifactId>spring-boot-starter-tomcat</artifactId> 30 <scope>provided</scope> 31 </dependency> 32 <dependency> 33 <groupId>org.springframework.boot</groupId> 34 <artifactId>spring-boot-starter-thymeleaf</artifactId> 35 </dependency> 36 <dependency> 37 <groupId>org.springframework.boot</groupId> 38 <artifactId>spring-boot-starter-web</artifactId> 39 </dependency> 40 41 <dependency> 42 <groupId>org.springframework.boot</groupId> 43 <artifactId>spring-boot-starter-test</artifactId> 44 <scope>test</scope> 45 </dependency> 46 <dependency> 47 <groupId>net.sourceforge.nekohtml</groupId> 48 <artifactId>nekohtml</artifactId> 49 <version>1.9.21</version><!--$NO-MVN-MAN-VER$--> 50 </dependency> 51 52 <dependency> 53 <groupId>org.thymeleaf.extras</groupId> 54 <artifactId>thymeleaf-extras-java8time</artifactId> 55 <version>2.1.0.RELEASE</version> 56 </dependency> 57 58 <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> 59 <dependency> 60 <groupId>org.apache.commons</groupId> 61 <artifactId>commons-lang3</artifactId> 62 <version>3.4</version> 63 </dependency> 64 65 <!-- spring security --> 66 <dependency> 67 <groupId>org.springframework.boot</groupId> 68 <artifactId>spring-boot-starter-security</artifactId> 69 </dependency> 70 <dependency> 71 <groupId>org.thymeleaf.extras</groupId> 72 <artifactId>thymeleaf-extras-springsecurity4</artifactId> 73 </dependency> 74 <!-- spring security --> 75 <dependency> 76 <groupId>org.springframework.boot</groupId> 77 <artifactId>spring-boot-configuration-processor</artifactId> 78 <optional>true</optional> 79 </dependency> 80 <!-- --> 81 82 83 <dependency> 84 <groupId>com.microsoft.sqlserver</groupId> 85 <artifactId>mssql-jdbc</artifactId> 86 <version>6.2.1.jre8</version> 87 </dependency> 88 89 90 </dependencies> 91 92 <repositories> 93 <repository> 94 <id>forgerock</id> 95 <url>http://maven.forgerock.org/repo/releases</url> 96 </repository> 97 </repositories> 98 99 <properties> 100 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 101 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 102 <java.version>1.8</java.version> 103 <openam.version>10.0.0</openam.version> 104 <!-- property name = "hibernate.show_sql" value = "true" /--> 105 </properties> 106 107 <build> 108 <plugins> 109 <plugin> 110 <groupId>org.springframework.boot</groupId> 111 <artifactId>spring-boot-maven-plugin</artifactId> 112 <configuration> 113 <failOnMissingWebXml>false</failOnMissingWebXml> 114 </configuration> 115 </plugin> 116 </plugins> 117 </build> 118 119 <packaging>war</packaging> 120</project>

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

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

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

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

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

guest

回答2

0

自己解決

アドバイス対象のメソッドにfinalがついていることが原因でした

https://stackoverflow.com/a/37051785

spring+aspectの仕組みとして、内部的にアドバイス対象クラスのサブクラスを作って処理を行っているようです。
そのため、メソッドにfinal(継承禁止)がつくと、そのメソッドだけはポイントカットが正しく機能しなくなってしまうみたいです。
今回メソッドにfinalをつけていたのはコーディング規約でオーバーライドさせる気が無いならfinalを必ずつけようと決まっていたのでつけていただけなのでこれをはずして対応することにしました。
(そもそもfinalをつけたまま機能させる方法はなさそう?)

java

1@Controller 2public class TestController { 3 @Autowired 4 private ManagementService managerService; 5 @RequestMapping(value = {"/test"}) 6 public ModelAndView testLogin( //メソッドについていたfinalを削除したらmanagerServiceがnullにならなかった 7 final HttpServletRequest request) { 8 final ModelAndView mav = new ModelAndView(); 9 managerService.hogehoge(); 10 return mav; 11 } 12}

投稿2018/10/17 09:28

koronatail

総合スコア433

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

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

0

SpringFrameworkとAspectJのバージョンが書かれていないので解決しなかったら場合はご容赦ください。
5.0系でしたら、以下のアーティファクトを含めましょう。

  • spring-aspects

pom.xml

xml

1 <dependency> 2 <groupId>org.springframework</groupId> 3 <artifactId>spring-aspects</artifactId> 4 </dependency>

投稿2018/10/17 07:33

A-pZ

総合スコア12011

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

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

koronatail

2018/10/17 07:58

回答ありがとうございます。バージョンの記載を失念していました。諸事情でSpring 4系を利用しています。 回答でいただいたdepedencyをそのまま記載してmaven installしても状況は変わらず、バージョンを4.3.20.RELEASEと指定したらOverriding managed version 4.2.7.RELEASE for spring-aspectsと警告がでてきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問