開発環境
- Java 1.8.0
- TERASOLUNA Server Framework for Java (5.4.1.RELEASE)
- Spring Framework 4.3.14.RELEASE
はじめに
チラシの裏です。
普通にインナークラスをビーン定義してみる
以下のようなクラスを定義したとします。引数の2つのint
を足して返すメソッドのテストです。
InnerTest.java
@RunWith(SpringRunner.class)
public class InnerTest {
@Inject
Inner inner;
@Test
public void test() {
int a = 1;
int b = 2;
// アサーション
assertThat(inner.add(a, b), equalTo(a + b));
}
/**
* テスト用のインナークラス
*
*/
public class Inner {
// 引数の値を足すして返すだけ
public int add(int a, int b) {
return a + b;
}
}
}
で、ビーン定義すると以下のようになると思います。
InnerTest-context.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
">
<bean class="example.InnerTest.Inner" />
</beans>
実行すると……
エラーログ
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'example.InnerTest' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1493)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835)
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)
... 43 common frames omitted
なんでや!ビーン定義したやろ!
と、思ってググったら同じ質問をしている人がいました。
How to create a Spring Bean of a Inner class?
- インナークラスをstaticにする。
または
- .ではなく$でつなぐ
のどちらかをやると解決します
この記事を投稿するに至った経緯
需要があるかわかりませんが、業務で開発しているシステムで必要になったのでメモとして。
たとえばテストで、テスト用のController
をかをstaticなインナークラスとして定義しておけばパッケージがテストクラスだけになって見やすくなるのではないでしょうか。