gpt4 book ai didi

java - @SpringBootApplication 和@ComponentScan 不能一起工作(bean 配置)

转载 作者:搜寻专家 更新时间:2023-10-31 19:59:34 25 4
gpt4 key购买 nike

我有一个多模块项目,但我的配置有问题。我在 nl.example.hots.boot 包中有一个主要方法

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan(basePackages = {"nl.*"})
@EntityScan("nl.*")
public class HotsApplication {

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

在 nl.example.hots.core.* 包中我有这个类:

@Service
@AllArgsConstructor
@Transactional(propagation = Propagation.REQUIRED)
public class MapImportService {

private MapInputModelMapper mapInputModelMapper;
private MapEntityRepository mapEntityRepository;

public void add(final MapInputModel mapInputModel) {
System.out.println(mapInputModel.getName());
mapEntityRepository.save(mapInputModelMapper.mapToEntiy(mapInputModel));
}

和:

@Component
@Mapper
public interface MapInputModelMapper {

MapInputModel mapToInputModel(final MapEntity n);

MapEntity mapToEntiy(final MapInputModel n);

}

存储库位于包 nl.example.hots.persistence.* 中

运行应用程序时出现以下错误:

Description:

Parameter 0 of constructor in nl.example.hots.core.dataimport.MapImportService.MapImportService required a bean of type 'nl.timonschultz.hots.core.map.mapper.MapInputModelMapper' that could not be found.


Action:

Consider defining a bean of type 'nl.example.hots.core.map.mapper.MapInputModelMapper' in your configuration.

当我删除 @EnableAutoConfiguration 和 @ComponentScan 注释时,它起作用了。应用程序在没有 bean 错误的情况下启动。

在那种情况下,我的 restcontroller 不再工作了:

{
"timestamp": "2018-07-18T20:48:39.414+0000",
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/maps"
}

当我删除 MapImportService 类(并且没有弹出 bean 错误)时,它在同一个 url 上工作。

package nl.example.hots.api.data_import;

@RestController
@AllArgsConstructor
public class ImportController {

private static final String URL = // a url
private Reader reader;

@RequestMapping("/maps")
public String abilityStreamImport() {
reader.readStream(URL); // calls a class in nl.example.hots.core.*
return "Greetings from APP!";
}
}

我尝试了几种不同的组合,并且我有一个不同的项目作为例子,其中注释一起使用并且它工作正常。有人可以解释为什么注释一起使用时会产生 bean 错误吗?为什么 Controller 在只使用@SpringBootApplication 时会报错?

在我的 Pom.XML 中,引导模块依赖于 API 层,而 API 层又依赖于核心层,而核心层又依赖于持久层。我在项目中使用了 mapstruct 和 Lombok。

--- 编辑:存储库 ---

@Entity(name = "MAPS")
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
public class MapEntity extends HasId<Long> {

private String name;

@ElementCollection
private List<String> translations;

}

@Repository
public interface MapEntityRepository extends JpaRepository<MapEntity, Long> {
}

@MappedSuperclass
public abstract class HasId<T> {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Setter
@Getter
private T id;
}

项目结构:

hots-application;
- hots-api
- pom.xml
- nl.example.hots.api.dataimport.ImportController;
- hots-boot
- pom.xml
- nl.example.hots.boot.HotsApplication;
- hots-core
- pom.xml
- nl.example.hots.core.dataimport.mapImportService.MapImportService;
- nl.example.hots.core.map.mapper.MapInputModelMapper
- hots-persistence
- pom.xml
- nl.example.hots.persistence.common.HasId;
- nl.example.hots.persistence.map.MapEntity;
- nl.example.hots.persistence.map.MapEntityRepository;
pom.xml

最佳答案

Spring Boot会扫描所有以@SpringBootApplication注解类所在的包开始的包和子包。你的类在nl.example.hots.boot 只扫描那个包裹。其他类位于不同的非扫描包中。

由于此包结构且未遵循 best practices您基本上失去了很多自动配置功能(Spring Data JPA、ReST 等),您必须求助于手动启用/配置它。部分通过添加额外的 @ComponentScan 注释,为 JPA 添加 @EntityScan 注释。但是您还需要添加所有 @EnableJpaRepository 等注释,因为不再添加这些注释(至少不使用正确的包)。

修复相当简单。将您的 @SpringBootApplication 注释类移动到 nl.example.hots 包(如 best practices 中所述)。删除除 @SpringBootApplication 之外的注释,然后简单地启动您的应用程序。

关于java - @SpringBootApplication 和@ComponentScan 不能一起工作(bean 配置),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51410871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com