Spring Boot部署外部Tomcat后调用Service报EntityNotFoundException
Spring Boot 2.x部署外部Tomcat后Service调用Repository异常问题
开发基于Spring Boot 2.x的应用,本地使用内嵌Tomcat服务器时所有API(包括获取实体的接口)均正常运行,但部署到外部Tomcat服务器后,通过Service层调用Repository层的API会抛出EntityNotFoundException。有趣的是,若绕过Service层直接在Controller中调用Repository,则无报错,API可正常工作。
问题详情
- 环境:Spring Boot 2.x、外部Tomcat服务器
- 现象:通过Service调用Repository时触发
EntityNotFoundException - 观察:Controller直接调用Repository无异常
非工作代码示例
Controller:
@RestController @RequiredArgsConstructor @RequestMapping("/api/admin") public class SponsorController { private final SponsorService sponsorService; @GetMapping("/v1/sponsors") public ResponseEntity<ApiResponse<List<SponsorResponse>>> getSponsors() { List<SponsorResponse> result = sponsorService.findSponsors(); ApiResponse<List<SponsorResponse>> response = ApiResponse.success(result); return ResponseEntity.ok(response); } @GetMapping("/v1/sponsors/{sponsorId}") public ResponseEntity<ApiResponse<SponsorResponse>> getSponsor(@PathVariable final Long sponsorId) { SponsorResponse result = sponsorService.findSponsor(sponsorId); ApiResponse<SponsorResponse> response = ApiResponse.success(result); return ResponseEntity.ok(response); } }
Service:
@Service @RequiredArgsConstructor public class SponsorService { private final SponsorRepository sponsorRepository; public List<SponsorResponse> findSponsors() { List<Sponsor> sponsors = sponsorRepository.findAll(); return SponsorResponse.listOf(sponsors); } public SponsorResponse findSponsor(long sponsorId) { return sponsorRepository.findById(sponsorId).map( SponsorResponse::of ).orElseThrow( () -> new EntityNotFoundException(ErrorCode.ENTITY_NOT_FOUND) ); } }
工作代码示例(直接调用Repository)
Controller:
@RestController @RequiredArgsConstructor @RequestMapping("/api/admin") public class SponsorController { private final SponsorRepository sponsorRepository; @GetMapping("/v1/sponsors") public ResponseEntity<ApiResponse<List<SponsorResponse>>> testSponsors() { List<Sponsor> all = sponsorRepository.findAll(); List<SponsorResponse> sponsorResponses = SponsorResponse.listOf(all); ApiResponse<List<SponsorResponse>> response = ApiResponse.success(sponsorResponses); return ResponseEntity.ok(response); } @GetMapping("/v1/sponsors/{sponsorId}") public ResponseEntity<ApiResponse<SponsorResponse>> testSponsor(@PathVariable("sponsorId") Long sponsorId) { Sponsor sponsor = sponsorRepository.findById(sponsorId).orElseThrow( () -> new EntityNotFoundException(ErrorCode.ENTITY_NOT_FOUND) ); SponsorResponse response = SponsorResponse.of(sponsor); return ResponseEntity.ok(ApiResponse.success(response)); } }
为何绕过Service层能解决部署后的问题?是否是本地与服务器环境差异导致Service层的事务行为或代理机制配置错误?恳请提供调试或修复建议。已排查过@Transactional相关问题。
内容的提问来源于stack exchange,提问作者이혜지
相关产品推荐
相关产品推荐

