代码之家  ›  专栏  ›  技术社区  ›  tomaytotomato

弹簧靴1.5.10间歇性复位控制器404问题?

  •  1
  • tomaytotomato  · 技术社区  · 6 年前

    我在使用Spring boot和一个控制器时遇到了一个奇怪的问题。

    我认为这是由于与另一个同名控制器(更新版本)发生冲突

     controllers
        -v2
           -PartController(@RestController)
        -v1
           -PartController(@RepositoryRestController)
     repositories
        -v2
           -PartRepository(@Repository)
        -v1
           -PartRepository(@RepositoryRestResource(path = "/part"))
    

    这样做的原因是,我们正在引入一个服务层,并希望远离Restful存储库。所以 v1 最终将被移除。

    但是,在启动服务时,原始存储库方法有时不映射(不确定)。

    正确的端点

    enter image description here

    不正确的端点(jpa基本方法)

    enter image description here

    v1部件控制器

    @RepositoryRestController
    public class PartController {
    
    ... more code
    

    v1零件库

    @CrossOrigin
    @RepositoryRestResource(path = "/part")
    public interface PartRepository extends JpaRepository<Part, Long> {
    
    ... more code
    

    v2部件控制器

    @RestController("PartController2")
    @RequestMapping(path = "/api/v2", name = "PartController2")
    public class PartController implements PartsApi {
    
    @RequestMapping(
          method = RequestMethod.POST,
          path = "/parts/usage/")
        @Override
        public List<PartResponse> getPartUsage(@RequestBody final                          List<PartUsageRequest> request) {
        return this.service.getPartUsage(request);
      }
    

    @Repository("PartRepository2")
    public interface PartRepository extends CrudRepository<Part, Long> {
    
      Optional<Part> findById(Long id);
    
    }
    

    请注意,新端点正在工作,而与另一个端点无关

    enter image description here

    如上所述,端点的这种可用性是随机的。 当Spring boot在启动时映射每个控制器时,这可能是一种竞争条件吗?

    这是完全随机的,重新运行或maven清理服务可以按预期工作。然后再次启动这些端点 /parts 不可用,导致故障 404

    1.5.10.RELEASE

    斯普林福克斯(大摇大摆): 2.8.0

    1 回复  |  直到 6 年前
        1
  •  1
  •   user10639668 user10639668    6 年前

    我已经设法在一个概念验证项目中重现了您的问题。这是因为同一实体(在您的案例中)有多个存储库。

    this change request 详情请参阅。唯一的区别是你有 @Repository @RepositoryRestResource(exported = false) 在第二个存储库上,结果是一样的:资源在大约50%的时间内导出。

    我看到的唯一解决办法是:去掉第二个存储库。

    question 这也很有趣。