... NoteController中的字段存储库需要一个类型为... NoteRepository的bean

时间:2019-04-30 11:58:34

标签: java spring-boot spring-mvc

我试图执行一个Spring项目,但是总是返回一个错误,我不知道问题是否出在Spring Boot的版本上。

我有两个项目:

  • IntegrationCore(春季启动项目);
  • IntegrationModel(仅适用于模型);

项目IntegrationCore包含项目IntegrationModel的引用(构建路径->项目)

当我执行项目IntegrationCore(以-> Spring boot app运行)时,返回控制台错误:

  
     

申请无法开始

     
     

说明:

     

com.integration.controller.NoteController中的字段存储库需要一个找不到'com.integration.repository.NoteRepository'类型的bean。   行动:   考虑在配置中定义一个类型为'com.integration.repository.NoteRepository'>的bean。

我尝试过:

  • 将Spring Boot的版本从1.5.7更改为1.5.20;
  • 在Application类中包含mongoDb的注释;
  • 插入注释以引用IntegrationCore软件包;

IntegrationCore

 src/
 ├── main/
 │   └── java/
 |       ├── com.integration/
 |       |   └── IntegrationCoreApplication.java
 |       ├── com.integration.controller/
 |       |   └── NoteController.java
 |       └── com.integration.repository/
 |           └── NoteRepository.java

IntegrationModel

 src/
 ├── main/
 │   └── java/
 |       ├── com.integrationModel/
 |       |   └── NoteStatuses.java
 |       └── com.integrationModel.filter/
 |           └── NoteStatusesParams.java

IntegrationCoreApplication.java

package com.integration;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(scanBasePackages={
"com.integration", "com.integrationModel"})
public class IntegrationCoreApplication {

    public static void main(String[] args) {
        SpringApplication.run(IntegrationCoreApplication.class, args);
    }

}

NoteController.java

package com.integration.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.integrationModel.NoteStatuses;
import com.integrationModel.filter.NoteStatusesParams;
import com.integration.repository.NoteRepository;

@Component
@RestController
@RequestMapping(value = "/services/nota")
public class NoteController {

    @Autowired
    private NoteRepository repository;

    @RequestMapping(value = "/getStatuses", method = RequestMethod.POST)
    @ResponseBody
    public List<NoteStatuses> getStatuses(@RequestBody List<NoteStatusesParams> params) {
        return repository.findStatuses(params);
    }

}

NoteRepository.java

package com.integration.repository;

import java.util.List;

import org.springframework.stereotype.Service;

import com.integrationModel.NoteStatuses;
import com.integrationModel.filter.NoteStatusesParams;

@Service
public interface NoteRepository {
    List<NoteStatuses> findStatuses(List<NoteStatusesParams> param);
}

NoteStatusesParams.java

package com.integrationModel.filter;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Singular;

import java.util.List;

@Getter
@Builder(builderClassName = "Builder")
@NoArgsConstructor
@AllArgsConstructor
public class NoteStatusesParams {
    @Singular
    private List<String> orderNumbers;
    private String providerCpfCnpj;
    private String noteNumber;
}

NoteStatuses.java

package com.integrationModel;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Date;

@Data
@EqualsAndHashCode(of = {"id"})
public class NoteStatuses {

    private Boolean physicalReceipt;
    ...
}

3 个答案:

答案 0 :(得分:0)

问题与您的以下定义相同。

@Service
public interface NoteRepository {
    List<NoteStatuses> findStatuses(List<NoteStatusesParams> param);
}

这是一个接口,您不能使用@Service将其定义为服务。 Spring会尝试为此bean创建一个实例,因此它失败了。

您需要使用@Repostiry批注并通过扩展相关存储库(例如JPA或ElasticSearch存储库)将其定义为存储库。

答案 1 :(得分:0)

如果您将NoteRepository用作存储库,那么最好使用@Repository而不是@Service。

@SpringBootApplication
public class IntegrationCoreApplication {
    public static void main(String[] args) {
        SpringApplication.run(IntegrationCoreApplication.class, args);
    }

@SpringBootApplication 注释等效于使用@ Configuration,@ EnableAutoConfiguration和@ComponentScan及其默认属性。 而且使用3个注释和1个@SpringBootApplication的区别就在于它们,

@Configuration
@EnableAutoConfiguration
@Import({ ABC.class, XYZ.class }) 

不会自动检测到@Component注释的类,并且会显式导入用户定义的bean(请参阅@Import)。

答案 2 :(得分:0)

问题是您在接口上放置了@Service注释,但是该接口没有实现Spring可以按类型注入的实现。您有两个可能性:

  1. 您应该扩展Spring Data存储库接口之一,并让Spring为您创建一个实现。假设NoteEntity是实体,并且其ID类型为Long,则它看起来像:
@Repository
public interface NoteRepository extends JpaRepository<NoteEntity, Long>{
}

这是使用JpaRepository的示例。而且,您还必须将@EnableJpaRepositories(basePackages = {"com.integration.repository"})放在IntegrationCoreApplication类上,以使Spring扫描存储库并为您创建实现。当然可以定义更多方法,但是您将不得不使用spring-data-jpa特定的方法名称。

  1. 创建您自己的存储库实现,并使用任何构造型注释(例如@Component甚至@Repository对其进行注释,因为它也是一个组件。