春のオートワイヤリングは、依存関係については、「忘れてしまいました」

devnull:

私は、Beanスコープの異なる種類の周りにプレイしたいです。だから私は、Beanが変わっていた場合、私は見ることができるように乱数を生成する必要がありますテスト環境を書きました。私のテストのセットアップは動作しませんし、私は私が見つけたものを説明することはできません。

私は春のフレームワーク5.15と春ブーツ2.13を使用しています。

次のセットアップ:

メインクラス:

package domain.webcreator;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class WebcreatorApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebcreatorApplication.class, args);
    }
}

豆のクラス:

package domain.webcreator;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Random;

@Configuration
public class Beans {
    @Bean
    public Random randomGenerator() {
        return new Random();
    }
}

Scoperクラス:

package domain.webcreator;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import java.util.Random;

@Service
@Scope("singleton")
public class Scoper {
    private Random rand;

    public Scoper(Random rand) {
        this.rand = rand;
    }

    public int getNumber(int max) {
        return rand.nextInt(max);
    }
}

インデックスコントローラ

package domain.webcreator.controller;

import domain.webcreator.Scoper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class IndexController {
    @GetMapping("/")
    @ResponseBody
    @Autowired
    public String indexAction(Scoper scoper) {
        return String.valueOf(scoper.getNumber(50));
    }
}

私の問題は、呼び出し中に、私はNPEを得ること、であるscoper.getNumber(50) デバッグ時に、ランダムBeanが生成され、scoperコンストラクタに渡されるので、これは奇妙です。その後、コントローラでは、ランドプロパティはnullです。Scoper豆の作成にデバッグ インデックスのコントローラにデバッグ、Scoper Beanを作成した検査

何が私が間違っているのでしょうか?

chrylis -on strike-:

あなたは、適用しようとしている@Autowired春がどのように動作するかではないランダムな方法、に。コントローラのメソッドのパラメータは、そのHTTPリクエストではなく、一般的な依存関係への情報特定のためのものであり、春は新しい作成しようとしているので、Scoper要求に関連付けられていることを-しかし、それは埋めるために、要求のいずれかの入力値を持っていません(。私は実際にあなたがいないデフォルトコンストラクタについてのエラーを取得していない驚いています。)

代わりに、あなたを渡すScoperコンストラクタで。

@RestController
public class IndexController {
    private final Scoper scoper;

    public IndexController(Scoper scoper) {
        this.scoper = scoper;
    }

    @GetMapping("/")
    public String indexAction(Scoper scoper) {
        return String.valueOf(scoper.getNumber(50));
    }
}

ノートのカップル:

  • シングルトンスコープはデフォルトであり、それを指定する必要はありません。
  • @RestController繰り返しに好適である@ResponseBodyあなたが混在コントローラクラスを持っていない限り。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=203930&siteId=1