1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

インナークラスをビーン定義する方法

Posted at

開発環境

  • 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にする。

または

  • .ではなく$でつなぐ

のどちらかをやると解決します

この記事を投稿するに至った経緯

需要があるかわかりませんが、業務で開発しているシステムで必要になったのでメモとして:stuck_out_tongue:
たとえばテストで、テスト用のControllerをかをstaticなインナークラスとして定義しておけばパッケージがテストクラスだけになって見やすくなるのではないでしょうか:v:

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?