This is an automated email from the ASF dual-hosted git repository. jamesbognar pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/juneau.git
commit 26e54dabe759043e1c9d9d4da0571435745cfcd3 Author: James Bognar <[email protected]> AuthorDate: Fri May 8 15:20:01 2026 -0400 refactor(inject): TODO-15 phase-3 batch 12 — RestOpContext + RestContext child resource RestOpContext.createPartSerializer: - BeanCreator.of(HttpPartSerializer.class).type(c).orElse(defaultSerializer) -> c == null ? defaultSerializer : BeanInstantiator.of(HttpPartSerializer.class) .beanSubType(c) .fallback(() -> defaultSerializer) .run() - Legacy .type(null) was tolerant; v2 beanSubType(null) throws, so the call site short-circuits when c is null (preserves legacy behavior of "no override class -> use default serializer"). - Imports: dropped org.apache.juneau.cp.* (no longer needed) and consolidated commons.inject onto a wildcard import. RestContext (child resource on line 1131): - BeanCreator.of(rc2, bs).run() -> BeanInstantiator.of(rc2, bs).run(). Single-shot bean creation, no .type()/.impl() configuration; safe direct swap. - Added BeanInstantiator import. NOT migrated this batch: - RestContext.findRestOperationArgs (line 2699): BeanCreator.of(RestOpArg.class, bs).type(c).run() Attempted migration to BeanInstantiator.of(...).beanSubType(c).run() broke jetty-ftest with: "Could not instantiate class AttributeArg: No methods/constructors found with matching parameters." Root cause: legacy BeanCreator's static-factory discovery treats methods named create() / builder() / getInstance() as bean factories. v2 BeanInstantiator's factoryMethodNames default is {"getInstance"} only — create() / builder() are reserved for builder-type detection (they are expected to return a builder, not the bean itself). RestOpArg classes like AttributeArg, BodyArg, HeaderArg, etc. expose a static create(ParameterInfo) factory that returns the bean type directly, which matches legacy semantics but not the v2 default. Resolution will be either (a) adding "create" / "builder" to the BeanInstantiator default factoryMethodNames, or (b) configuring this single call site with .factoryMethodNames("getInstance", "create"). Either is a separate batch; keeping the legacy BeanCreator call here for now. Tests: - Full juneau-utest passes after the partial migration. Co-authored-by: Cursor <[email protected]> --- .../src/main/java/org/apache/juneau/rest/RestContext.java | 3 ++- .../src/main/java/org/apache/juneau/rest/RestOpContext.java | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java index ba5f7d115e..d9731ef540 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java @@ -18,6 +18,7 @@ package org.apache.juneau.rest; import org.apache.juneau.commons.http.MediaType; import org.apache.juneau.commons.inject.BasicBeanStore2; +import org.apache.juneau.commons.inject.BeanInstantiator; import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.commons.inject.WritableBeanStore; @@ -1128,7 +1129,7 @@ public class RestContext extends Context { if (bs.getBean(rc2).isPresent()) { so = () -> bs.getBean(rc2).get(); } else { - Object o2 = BeanCreator.of(rc2, bs).run(); + Object o2 = BeanInstantiator.of(rc2, bs).run(); so = () -> o2; } var cc = new RestContext(new Args(rc2, this, servletConfig, so, "", null)); diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java index 7aefacc2ca..d9194b8c35 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java @@ -40,12 +40,10 @@ import org.apache.juneau.*; import org.apache.juneau.commons.annotation.*; import org.apache.juneau.commons.collections.FluentMap; import org.apache.juneau.commons.function.Memoizer; -import org.apache.juneau.commons.inject.BasicBeanStore2; -import org.apache.juneau.commons.inject.WritableBeanStore; +import org.apache.juneau.commons.inject.*; import org.apache.juneau.commons.lang.*; import org.apache.juneau.commons.reflect.*; import org.apache.juneau.commons.utils.*; -import org.apache.juneau.cp.*; import org.apache.juneau.encoders.*; import org.apache.juneau.http.annotation.*; import org.apache.juneau.http.annotation.Header; @@ -156,7 +154,9 @@ public class RestOpContext extends Context implements Comparable<RestOpContext> } private static HttpPartSerializer createPartSerializer(Class<? extends HttpPartSerializer> c, HttpPartSerializer defaultSerializer) { - return BeanCreator.of(HttpPartSerializer.class).type(c).orElse(defaultSerializer); + return c == null + ? defaultSerializer + : BeanInstantiator.of(HttpPartSerializer.class).beanSubType(c).fallback(() -> defaultSerializer).run(); } private final WritableBeanStore opBeanStore;
