You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者이혜지

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 13:23:31