【问题标题】:Parameter 0 of constructor in ..... Spring Boot...... Spring Boot中构造函数的参数0
【发布时间】:2018-10-28 22:44:29
【问题描述】:

我在启动我的应用时遇到问题。有人可以帮我解决这个问题吗?

Parameter 0 of constructor in com.journaldev.elasticsearch.service.BookServiceImpl required a bean of type 'com.journaldev.elasticsearch.dao.search.BookRepositorySearch' that could not be found.
Action:
Consider defining a bean of type 'com.journaldev.elasticsearch.dao.search.BookRepositorySearch' in your configuration.

GenericRepository

public interface GenericRepository<T, K> {
  Map<String, Object> get(final K id);
}

GenericRepositoryImpl

public class GenericRepositoryImpl<T, K extends Serializable> implements GenericRepository<T, K> { 

  private RestHighLevelClient restHighLevelClient;

  private ObjectMapper objectMapper;

  public GenericRepositoryImpl(ObjectMapper objectMapper, RestHighLevelClient restHighLevelClient) {
    this.objectMapper = objectMapper;
    this.restHighLevelClient = restHighLevelClient;
  }

  @Override
  public Map<String, Object> get(K id) {
    return null;
  }
}

书库搜索

@Component
public interface BookRepositorySearch extends GenericRepository<Book, Long> {}

图书服务

public interface BookService {
  Map<String, Object> get(final Long id);    
}

BookServiceImpl

@Service
public class BookServiceImpl implements BookService {

  private final BookRepositorySearch bookRepositorySearch;

  public BookServiceImpl(BookRepositorySearch bookRepositorySearch) {
    this.bookRepositorySearch = bookRepositorySearch;
  }      
  @Override
  public Map<String, Object> get(Long id) {
    return null;
  }
}

【问题讨论】:

  • @Autowired添加到BookServiceImpl的构造函数中。
  • @Berger 如果组件只有一个构造函数(自 Spring 4 IIRC 起),则不再需要使用 @Autowired
  • 我尝试将 @Autowired 添加到 BookServiceImpl 的构造函数中,但它不起作用,我将项目放入 github 以获得更多可见性
  • @MarkRotteveel:谢谢,我不知道。

标签: java spring-boot


【解决方案1】:

我用这个配置解决了这个问题。 在您的配置文件中查找@EnableAutoConfiguration

@Configuration

@EnableJpaRepositories(basePackages = "com.akog02.repostories")

@EntityScan(basePackages = "com.akog02.domain")

@EnableTransactionManagement

@EnableAutoConfiguration

public class WebConfiguration {

}

【讨论】:

    【解决方案2】:

    从您以前的 cmets 看来,您希望将 BookRepositorySearch 保留为接口。如果是这种情况,您需要创建该接口的具体实例并将@Component 放在上面。

    您的接口声明中不需要@Component,并且您不能在接口中扩展类。

    public interface BookRepositorySearch {}
    

    创建一个具体的类型来实现接口并扩展你想要自动装配的GenericRepository&lt;Book, Long&gt; 并将@Component 放在上面:

    @Component
    public class BookRepositorySearchImpl 
        implements BookRepositorySearch 
        extends GenericRepository<Book, Long>  
    {}
    

    https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-class-ctor

    使用构造函数实例化

    当你创建一个 bean 时 构造方法,所有普通类都可以使用并兼容 与春天。也就是说,正在开发的类不需要 实现任何特定的接口或以特定的方式编码 时尚。只需指定 bean 类就足够了。然而, 根据您用于该特定 bean 的 IoC 类型,您可以 需要一个默认(空)构造函数。

    Spring IoC 容器几乎可以管理您希望它管理的任何类 管理;它不仅限于管理真正的 JavaBean。大多数春天 用户更喜欢只有默认值(无参数)的实际 JavaBean 以 容器中的属性。你也可以拥有更多的异国情调 容器中的非 bean 样式类。例如,如果您需要 使用绝对不遵守 JavaBean规范,Spring也可以管理。

    【讨论】:

      【解决方案3】:

      首先,您需要“告诉”spring 传递什么作为参数。最简单的选项是@Berger 在评论中提到的选项。如果出于某种原因这对您来说不是一个好方法(例如 BookRepositorySearch 不是 Spring 托管 bean),您可以制作一个包含更多逻辑的 java 配置文件:

      @Configuration
      public class Config {
      
         // you can use @Autowired here
      
      
         @Bean
         public BookService bookService() {
            return new BookServiceImpl(--pass your parameter here, get it however you want--)
         }
      
      }
      

      编辑:

      显然 Spring 不再需要 @Autowired(感谢 @Mark Rotteveel)。 所以问题是spring没有你的类的实例。原因是(我认为)您使用类参数而不是接口。如果您只是创建一个 BookRepositorySearch 实现的标记接口并将其用作参数而不是实际的实现,我希望它能够工作。 另一个解决方案是我上面已经写的,但是对于 BookRepositorySearch 类。

      @Configuration
      public class Config {
      
         // you can use @Autowired here
      
      
         @Bean
         public BookRepositorySearch bookRepositorySearch () {
            return new BookRepositorySearch();
         }
      
      }
      

      这样 Spring 将拥有它心爱的实例 ;)

      【讨论】:

      • 如果组件只有一个构造函数(自 Spring 4 IIRC 起),则不再需要使用 @Autowired。像这样产生错误的事实表明 Spring 尝试自动连接它。
      • @MarkRotteveel 哦,确实。有趣,我不知道 :) 我会更新我的答案
      【解决方案4】:

      如何将类作为接口继承?

        @Component 
        public interface BookRepositorySearch extends GenericRepository<Book, Long> {}
      

      用一个类改变这个接口然后再试一次。

        @Component
        public class BookRepositorySearch extends GenericRepository<Book, Long> {}
      

      【讨论】:

      • 这是一个从泛型接口扩展而来的接口,所以如果有人要添加另一个方法,他在BookRepositorySearch接口中添加它,然后他必须将它注入到服务中
      • @AymenKanzari 除非这是一个 spring-jpa 生成的存储库(或类似的),否则它必须是一个类,而不是一个可以工作的接口。
      • 我认为班级应该extends GenericRepositoryImpl&lt;Book, Long&gt;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 2021-04-04
      • 2022-01-26
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      相关资源
      最近更新 更多