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です。
何が私が間違っているのでしょうか?
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
あなたが混在コントローラクラスを持っていない限り。