{"record":{"id":"0d40ad29a37595f8","repo":"eclipse-vertx/vert.x","slug":"factory-already-registered","errorCode":null,"errorMessage":"Factory already registered","messagePattern":"Factory already registered","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"vertx-core/src/main/java/io/vertx/core/impl/verticle/VerticleManager.java","lineNumber":71,"sourceCode":"      factories.forEach(this::registerVerticleFactory);\n    }\n    VerticleFactory defaultFactory = new JavaVerticleFactory();\n    defaultFactory.init(vertx);\n    defaultFactories.add(defaultFactory);\n  }\n\n  public void registerVerticleFactory(VerticleFactory factory) {\n    String prefix = factory.prefix();\n    if (prefix == null) {\n      throw new IllegalArgumentException(\"factory.prefix() cannot be null\");\n    }\n    List<VerticleFactory> facts = verticleFactories.get(prefix);\n    if (facts == null) {\n      facts = new ArrayList<>();\n      verticleFactories.put(prefix, facts);\n    }\n    if (facts.contains(factory)) {\n      throw new IllegalArgumentException(\"Factory already registered\");\n    }\n    facts.add(factory);\n    // Sort list in ascending order\n    facts.sort((fact1, fact2) -> fact1.order() - fact2.order());\n    factory.init(vertx);\n  }\n\n  public void unregisterVerticleFactory(VerticleFactory factory) {\n    String prefix = factory.prefix();\n    if (prefix == null) {\n      throw new IllegalArgumentException(\"factory.prefix() cannot be null\");\n    }\n    List<VerticleFactory> facts = verticleFactories.get(prefix);\n    boolean removed = false;\n    if (facts != null) {\n      if (facts.remove(factory)) {\n        removed = true;\n      }","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/eclipse-vertx/vert.x/blob/fb308bd8c3f12c79f4ae89bef67fadf6c80d036e/vertx-core/src/main/java/io/vertx/core/impl/verticle/VerticleManager.java#L53-L89","documentation":"Registering the exact same VerticleFactory instance twice is rejected. The manager keeps a list per prefix and checks contains(factory) before adding, throwing IllegalArgumentException to prevent duplicate registration and double init().","triggerScenarios":"Calling registerVerticleFactory twice with the same factory instance (same object identity), typically during repeated bootstrap code, hot redeploy, or re-run initialization.","commonSituations":"Vertx instance recreated but factory held in a static/singleton field and registered again; framework bootstrap code executed multiple times.","solutions":["Guard registration: call registerVerticleFactory only once per Vertx instance per factory instance","Create a new factory instance for each Vertx, or check verticleFactories() for prior registration","Unregister the factory first with unregisterVerticleFactory before re-registering"],"exampleFix":"// before\nvertx.registerVerticleFactory(factory);\nvertx.registerVerticleFactory(factory); // throws\n// after\nif (!vertx.verticleFactories().contains(factory)) {\n  vertx.registerVerticleFactory(factory);\n}","handlingStrategy":"validation","validationCode":"boolean alreadyRegistered = vertx.verticleFactories().contains(factory);\nif (!alreadyRegistered) {\n  vertx.registerVerticleFactory(factory);\n}","typeGuard":null,"tryCatchPattern":"try {\n  vertx.registerVerticleFactory(factory);\n} catch (IllegalArgumentException e) {\n  if (!\"Factory already registered\".equals(e.getMessage())) throw e;\n  // idempotent: already registered, ignore\n}","preventionTips":["Register factories exactly once at Vertx bootstrap","Avoid static/singleton factory instances reused across Vertx lifecycles","Make bootstrap idempotent with a guard flag"],"tags":["verticle-factory","duplicate-registration","idempotency"],"backgroundTag":"invalid-state-transition","analyzedSha":"fb308bd8c3f12c79f4ae89bef67fadf6c80d036e","analyzedAt":"2026-09-06T11:37:12.241Z","contentChangedAt":"2026-09-06T11:37:12.241Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}