0

構成:

@Configuration
public class CoreConfig {

    @Bean
    public StatusService statusService(StatusPersistenceService statusPersistenceService) {
        return new StatusEventHandler(statusPersistenceService);
    }
}

クラスSpringは、デフォルトのコンストラクターがないと不平を言っています

@Configuration
public class StatusEventHandler implements StatusService {

    private final StatusPersistenceService statusPersistenceService;

    @Autowired
    public StatusEventHandler(final StatusPersistenceService statusPersistenceService) {
        this.statusPersistenceService = statusPersistenceService;
    }

}

この Bean が注入されるコントローラー:

@Controller
@RequestMapping("/showStatus")
public class ShowStatusController {

    @Autowired
    private StatusService statusService;

}

これはコンパイルされてテストに合格しますが、アプリ サーバーに公開すると、次のエラーが発生します。Spring がデフォルトの引数のないコンストラクターがあるべきだと考えるのはなぜですか?

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'statusEventHandler' 

...

No default constructor found;
4

2 に答える 2

2

@Configurationjavadocから:

@Configuration は @Component でメタアノテーションが付けられているため、 @Configuration クラスはコンポーネント スキャン (通常は Spring XML の要素を使用) の候補となり、フィールドおよびメソッド レベルで @Autowired/@Inject を利用することもできます(コンストラクターでは利用できません)。レベル)

@Component、または@Serviceサービスのより適切な注釈であり、実際には異なる方法で処理されますが、この場合、Bean を既に宣言している@Beanため、使用する必要はなく@Component、他のコンポーネントスキャン注釈 (@Service、@Repository など) も必要ありません。 ) StatusService Bean は@Bean注釈付きメソッドを介して既に定義されているためです。

Sotirios Delimanolis が指摘したように更新します。Spring プロセスの @Bean アノテーション付きメソッドには引数を含めないでください

   @Configuration
   public class CoreConfig {
     @Bean
     public StatusPersistenceService statusPersistenceService(){
     ....
     }

     @Bean
     public StatusService statusService() {
        return new StatusEventHandler(statusPersistenceService());
    }
 }

http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/context/annotation/Bean.htmlを参照してください。

于 2013-10-03T21:19:21.010 に答える
0

StatusEventHandler に @Component または @Service アノテーションを付けましたか? やってみてください。

于 2013-10-03T21:14:25.390 に答える