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 回答