Spring 启动 - 无法处理 IllegalStateException

Spring Boot - Can't handle IllegalStateException

我正在学习spring引导,但是,我遇到了一个问题,我找不到解决办法。当我尝试 运行 测试时,出现以下异常。

java.lang.IllegalStateException: Failed to load ApplicationContext

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bookServiceImplementation' defined in file []: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'uploadFileServiceImplementation' defined in file []: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.modelmapper.ModelMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'uploadFileServiceImplementation' defined in file []: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.modelmapper.ModelMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.modelmapper.ModelMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

我尝试在不同的地方添加注解,但并没有解决我的问题。我完全不知道我应该如何创建 ModelMapper bean。也许你会知道如何处理它。这是我的代码:

BookServiceImplementation.class

@Service
public class BookServiceImplementation implements BookService {
    private BookRepository bookRepository;
    private UploadFileService uploadFileService;
    private ModelMapper modelMapper;

    @Autowired
    public BookServiceImplementation(BookRepository bookRepository, UploadFileService uploadFileService,
                                 ModelMapper modelMapper){
        this.bookRepository = bookRepository;
        this.uploadFileService = uploadFileService;
        this.modelMapper = modelMapper;
    }

    @Override
    public void addBook(AddBookResource addBookResource) {
        Book book = new Book();
        Long coverImageId = addBookResource.getCoverImageId();
        Long contentId = addBookResource.getContentId();
        UploadFile coverImage = null;
        UploadFile bookContent = null;

        if (coverImage != null){
            coverImage = uploadFileService.findById(coverImageId)
                .map(fileResource -> modelMapper.map(fileResource, UploadFile.class))
                .orElse(null);
        }
        if (contentId != null){
        bookContent = uploadFileService.findById(contentId)
                .map(fileResource -> modelMapper.map(fileResource, UploadFile.class))
                .orElse(null);
        }

        book.setCoverImage(coverImage);
        book.setContent(bookContent);
        book.setTitle(addBookResource.getTitle());
        book.setDescription(addBookResource.getDescription());          
        book.setCategories(Arrays.stream(addBookResource.getCategories())
            .map(Category::new)
            .collect(Collectors.toSet()));

       bookRepository.save(book);
       }
}

UploadFileServiceImplementation.class

@Service
public class UploadFileServiceImplementation implements UploadFileService {
    private UploadFileRepository uploadFileRepository;
    private ModelMapper modelMapper;

    @Autowired
    public UploadFileServiceImplementation(UploadFileRepository uploadFileRepository, ModelMapper modelMapper){
       this.uploadFileRepository = uploadFileRepository;
       this.modelMapper = modelMapper;
    }

    @Transactional
    @Override
    public Long save(String filename, byte[] data) {
        UploadFile uploadFile = new UploadFile();
        uploadFile.setFileName(filename);
        uploadFile.setData(data);

        UploadFile saved = uploadFileRepository.save(uploadFile);
        return saved.getId();
    }

    @Override
    public Optional<FileResource> findById(Long id) {
        return uploadFileRepository.findById(id)
            .map(file -> modelMapper.map(file, FileResource.class));
    }
}

编辑 经过建议的更改后,我仍然得到 IllegalStateException:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bookService': Unsatisfied dependency expressed through field 'uploadFileService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'uploadFileService': Unsatisfied dependency expressed through field 'modelMapper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.modelmapper.ModelMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'uploadFileService': Unsatisfied dependency expressed through field 'modelMapper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.modelmapper.ModelMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.modelmapper.ModelMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

第 1 步:如果在主应用程序 class 或配置 class 中还没有模型映射器,则添加一个 @Bean

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

@Bean
public ModelMapper modelMapper() {
    return new ModelMapper();
}

}

第 2 步:这是您可以如何管理它,请在服务实现中进行以下更改:

@Service("uploadFileService")
public class UploadFileServiceImplementation implements UploadFileService {

   @Autowired
   private UploadFileRepository uploadFileRepository;

   @Autowired
   private ModelMapper modelMapper;

  //Remove constructure now.

BookServiceImplementation

也是如此
@Service("bookService")
public class BookServiceImplementation implements BookService {

   @Autowired
   private BookRepository bookRepository;

   @Autowired
   private UploadFileService uploadFileService;

   @Autowired
  private ModelMapper modelMapper;

//remove constructure