SpringBoot交易API启动报错:无法找到int类型Bean的问题咨询
解决SpringBoot启动时找不到int类型Bean的错误
错误根源
你遇到的启动错误,核心原因是**TransactionRequest和TransactionResponse被错误标记为@Component**,同时结合了@Builder注解。Lombok的@Builder会为类生成全参构造器,Spring在尝试创建这两个类的Bean时,会调用该构造器,但构造器参数都是int、double这类基本类型,Spring容器中不存在对应类型的Bean,因此抛出异常。
解决步骤
1. 移除DTO类的@Component注解
TransactionRequest和TransactionResponse是数据传输对象(DTO),不需要由Spring容器管理,直接移除它们的@Component注解:
修正后的TransactionRequest
@Data @Builder public class TransactionRequest { private int userId; private int merchantId; private int clientReferenceId; private double amount; private String createdBy; }
修正后的TransactionResponse
@Data @Builder public class TransactionResponse { private int userId; private int merchantId; private int clientReferenceId; private double amount; private LocalDateTime createdAt; private TransactionStatus status; }
2. 修复TransactionDao的空指针错误
原代码中transactionEntity仅声明未初始化,直接调用transactionEntity.builder()会触发空指针异常,需改为调用TransactionEntity.builder()并通过build()生成实例:
@Component public class TransactionDao { @Autowired TransactionRepository transactionRepository; public TransactionResponse createTransaction(TransactionRequest transactionRequest){ LocalDateTime currentTime = LocalDateTime.now(); // 初始化TransactionEntity实例 TransactionEntity transactionEntity = TransactionEntity.builder() .userId(transactionRequest.getUserId()) .merchantId(transactionRequest.getMerchantId()) .clientReferenceId(transactionRequest.getClientReferenceId()) .amount(transactionRequest.getAmount()) .createdBy(transactionRequest.getCreatedBy()) .createdAt(currentTime) .updatedAt(currentTime) .externalId(UUID.randomUUID()) .status(TransactionStatus.CREATED) .build(); transactionRepository.save(transactionEntity); // 补充返回DTO的完整字段 return TransactionResponse.builder() .userId(transactionEntity.getUserId()) .merchantId(transactionEntity.getMerchantId()) .clientReferenceId(transactionEntity.getClientReferenceId()) .amount(transactionEntity.getAmount()) .status(transactionEntity.getStatus()) .createdAt(transactionEntity.getCreatedAt()) .build(); } }
3. 修正拼写错误
- 修正服务类的拼写错误:
TransactoinService改为TransactionService
@Service public class TransactionService { @Autowired public TransactionDao transactionDao; public TransactionResponse createTransaction(TransactionRequest transactionRequest){ return transactionDao.createTransaction(transactionRequest); } }
- 修正控制器中的拼写错误,并添加明确请求路径:
@RestController public class TransactionController { @Autowired TransactionService transactionService; @PostMapping("/transactions") TransactionResponse createTransaction(@RequestBody TransactionRequest transactionRequest){ return transactionService.createTransaction(transactionRequest); } }
内容的提问来源于stack exchange,提问作者Prince Bhati
相关产品推荐
相关产品推荐

