java Sping Boot 中构造函数的参数0

wlwcrazw  于 11个月前  发布在  Java
关注(0)|答案(6)|浏览(115)

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

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;
  }
}

BookRepositorySearch

@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;
  }
}

piok6c0g

piok6c0g1#

从你之前的评论来看,似乎你想保留BookRepositorySearch作为一个接口。如果是这样的话,你需要创建一个该接口的具体示例,并将@Component放在上面。
在接口声明中不需要@Component,也不能在接口中扩展类。

public interface BookRepositorySearch {}

字符串
创建一个实现接口的具体类型,并扩展您想要自动连接的extends GenericRepository<Book, Long>,并将@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时,所有普通的类都可以被Spring使用并与Spring兼容。也就是说,正在开发的类不需要实现任何特定的接口或以特定的方式编码。只需指定bean class就足够了。然而,根据您为特定bean使用的IoC类型,您可能需要一个默认(空)构造函数。
Spring IoC容器几乎可以管理任何你想让它管理的类;它不仅限于管理真正的JavaBean。大多数Spring用户更喜欢实际的JavaBean,(无参数)构造函数和适当的setter和getter,它们是根据容器中的属性建模的。你也可以在你的容器中有更多的非bean风格的类。例如,你需要使用一个绝对不符合JavaBean规范的遗留连接池,Spring也可以管理它。

i5desfxk

i5desfxk2#

我用这个配置解决了,在你的 * 配置文件 * 中查找@EnableAutoConfiguration

@Configuration

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

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

@EnableTransactionManagement

@EnableAutoConfiguration

public class WebConfiguration {

}

字符串

zlhcx6iw

zlhcx6iw3#

首先,你需要“告诉”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将拥有它心爱的示例;)

m1m5dgzv

m1m5dgzv4#

如何将类作为接口继承?

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

字符串
使用类更改此接口,然后重试。

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

8ljdwjyq

8ljdwjyq5#

您必须在Prin中添加@EnableJpaRepositories(“org.tennis.Tennnis.dao”)

f0ofjuux

f0ofjuux6#

我浪费了一整天的时间,最后,我发现我在我的pom.xml中使用了下面的依赖项。

<dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
        </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <scope>test</scope>
    </dependency>

字符串
关于下面的依赖关系,我的代码工作

<!--        <dependency>-->
<!--            <groupId>org.springframework.boot</groupId>-->
<!--            <artifactId>spring-boot-starter-data-jpa</artifactId>-->
<!--            <scope>test</scope>-->
<!--        </dependency>-->

相关问题