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
The following commit(s) were added to refs/heads/master by this push:
new 82d0f2e Context API refactoring.
82d0f2e is described below
commit 82d0f2ea95cb365762b1e13416cb317c634a1074
Author: JamesBognar <[email protected]>
AuthorDate: Sun Sep 19 12:32:21 2021 -0400
Context API refactoring.
---
.../java/org/apache/juneau/rest/RestConverter.java | 6 +-
.../java/org/apache/juneau/rest/RestOpContext.java | 50 +---
.../apache/juneau/rest/RestOpContextBuilder.java | 287 ++++++++++++++-------
.../org/apache/juneau/rest/annotation/Rest.java | 2 +-
.../juneau/rest/annotation/RestAnnotation.java | 2 +-
.../org/apache/juneau/rest/annotation/RestGet.java | 2 +-
.../juneau/rest/annotation/RestGetAnnotation.java | 2 +-
.../org/apache/juneau/rest/annotation/RestOp.java | 2 +-
.../juneau/rest/annotation/RestOpAnnotation.java | 2 +-
.../apache/juneau/rest/annotation/RestPost.java | 2 +-
.../juneau/rest/annotation/RestPostAnnotation.java | 2 +-
.../org/apache/juneau/rest/annotation/RestPut.java | 2 +-
.../juneau/rest/annotation/RestPutAnnotation.java | 2 +-
.../juneau/rest/converters/Introspectable.java | 2 +-
.../apache/juneau/rest/converters/Queryable.java | 2 +-
.../apache/juneau/rest/converters/Traversable.java | 2 +-
16 files changed, 204 insertions(+), 165 deletions(-)
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConverter.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConverter.java
index 76c095b..d14f1c5 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConverter.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConverter.java
@@ -29,8 +29,7 @@ import org.apache.juneau.serializer.*;
* <ul class='javatree'>
* <li class='ja'>{@link Rest#converters()}
* <li class='ja'>{@link RestOp#converters()}
- * <li class='jm'>{@link RestOpContextBuilder#converters(Class...)}
- * <li class='jm'>{@link RestOpContextBuilder#converters(RestConverter...)}
+ * <li class='jm'>{@link RestOpContextBuilder#converters()}
* </ul>
*
* <h5 class='section'>Example:</h5>
@@ -73,8 +72,7 @@ import org.apache.juneau.serializer.*;
* </ul>
*
* <ul class='seealso'>
- * <li class='jm'>{@link RestOpContextBuilder#converters(Class...)}
- * <li class='jm'>{@link RestOpContextBuilder#converters(RestConverter...)}
+ * <li class='jm'>{@link RestOpContextBuilder#converters()}
* <li class='link'>{@doc RestConverters}
* </ul>
*/
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 1f7b9be..e260bc3 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
@@ -157,8 +157,7 @@ public class RestOpContext extends BeanContext implements
Comparable<RestOpConte
partParser = createPartParser(r, builder, bs);
bs.addBean(HttpPartParser.class, partParser);
- converters = createConverters(r, builder, bs).asArray();
- bs.addBean(RestConverter[].class, converters);
+ converters = bs.add(RestConverter[].class,
builder.converters().build().asArray());
guards = createGuards(r, builder, bs).asArray();
@@ -216,53 +215,6 @@ public class RestOpContext extends BeanContext implements
Comparable<RestOpConte
}
/**
- * Instantiates the result converters for this REST resource method.
- *
- * <p>
- * Instantiates based on the following logic:
- * <ul>
- * <li>Looks for REST conveters set via any of the following:
- * <ul>
- * <li>{@link
RestOpContextBuilder#converters(Class...)}/{@link
RestOpContextBuilder#converters(RestConverter...)}
- * <li>{@link RestOp#converters()}.
- * <li>{@link Rest#converters()}.
- * </ul>
- * <li>Looks for a static or non-static <c>createConverters()</>
method that returns <c>{@link RestConverter}[]</c> on the
- * resource class with any of the following arguments:
- * <ul>
- * <li>{@link Method} - The Java method this
context belongs to.
- * <li>{@link RestContext}
- * <li>{@link BeanStore}
- * <li>Any {@doc RestInjection injected beans}.
- * </ul>
- * <li>Resolves it via the bean store registered in this context.
- * <li>Instantiates a <c>RestConverter[0]</c>.
- * </ul>
- *
- * @param resource The REST resource object.
- * @param builder The builder for this object.
- * @param beanStore The bean store to use for retrieving and creating
beans.
- * @return The result converters for this REST resource method.
- * @throws Exception If result converters could not be instantiated.
- * @see RestOpContextBuilder#converters(Class...)
- */
- protected RestConverterList createConverters(Object resource,
RestOpContextBuilder builder, BeanStore beanStore) throws Exception {
-
- RestConverterList.Builder x =
builder.converters.beanStore(beanStore);
-
- x = BeanStore
- .of(beanStore, resource)
- .addBean(RestConverterList.Builder.class, x)
- .createMethodFinder(RestConverterList.Builder.class,
resource)
- .find("createConverters", Method.class)
- .thenFind("createConverters")
- .withDefault(x)
- .run();
-
- return x.build();
- }
-
- /**
* Instantiates the guards for this REST resource method.
*
* <p>
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContextBuilder.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContextBuilder.java
index f230dda..788122b 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContextBuilder.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContextBuilder.java
@@ -17,6 +17,8 @@ import static org.apache.juneau.assertions.Assertions.*;
import static org.apache.juneau.rest.HttpRuntimeException.*;
import java.lang.annotation.*;
import java.util.*;
+import java.util.function.*;
+
import org.apache.http.*;
import org.apache.juneau.*;
import org.apache.juneau.collections.*;
@@ -51,6 +53,9 @@ public class RestOpContextBuilder extends BeanContextBuilder {
String httpMethod, clientVersion;
Enablement debug;
List<String> path;
+
+ private RestConverterList.Builder converters;
+
PartList.Builder defaultFormData, defaultQueryData;
NamedAttributeList defaultRequestAttributes;
HeaderList.Builder defaultRequestHeaders, defaultResponseHeaders;
@@ -58,7 +63,6 @@ public class RestOpContextBuilder extends BeanContextBuilder {
List<MediaType> produces, consumes;
Set<String> roleGuard, rolesDeclared;
RestGuardList.Builder guards = RestGuardList.create();
- RestConverterList.Builder converters = RestConverterList.create();
EncoderGroup.Builder encoders;
SerializerGroup.Builder serializers;
ParserGroup.Builder parsers;
@@ -98,7 +102,10 @@ public class RestOpContextBuilder extends
BeanContextBuilder {
this.restContext = context;
this.restMethod = method;
- this.beanStore = context.getRootBeanStore();
+ this.beanStore = BeanStore
+ .of(context.getRootBeanStore(),
context.builder.resource().get())
+ .addBean(java.lang.reflect.Method.class, method);
+
this.defaultFormData = PartList.create();
this.defaultQueryData = PartList.create();
this.defaultRequestAttributes = NamedAttributeList.create();
@@ -131,6 +138,185 @@ public class RestOpContextBuilder extends
BeanContextBuilder {
}
/**
+ * Returns the REST servlet/bean instance that this context is defined
against.
+ *
+ * @return The REST servlet/bean instance that this context is defined
against.
+ */
+ public final Supplier<?> resource() {
+ return restContext.builder.resource();
+ }
+
+ /**
+ * Returns the default classes list.
+ *
+ * <p>
+ * This defines the implementation classes for a variety of bean types.
+ *
+ * <p>
+ * Default classes are inherited from the parent REST object.
+ * Typically used on the top-level {@link RestContextBuilder} to affect
class types for that REST object and all children.
+ *
+ * <p>
+ * Modifying the default class list on this builder does not affect the
default class list on the parent builder, but changes made
+ * here are inherited by child builders.
+ *
+ * @return The default classes list for this builder.
+ */
+ public final DefaultClassList defaultClasses() {
+ return restContext.builder.defaultClasses();
+ }
+
+
//-----------------------------------------------------------------------------------------------------------------
+ // beanStore
+
//-----------------------------------------------------------------------------------------------------------------
+
+ /**
+ * Returns access to the bean store being used by this builder.
+ *
+ * <p>
+ * Can be used to add more beans to the bean store.
+ *
+ * @return The bean store being used by this builder.
+ */
+ public final BeanStore beanStore() {
+ return beanStore;
+ }
+
+
//-----------------------------------------------------------------------------------------------------------------
+ // converters
+
//-----------------------------------------------------------------------------------------------------------------
+
+ /**
+ * Returns the builder for the {@link RestConverterList} object in the
REST context.
+ *
+ * @return The builder for the {@link RestConverterList} object in the
REST context.
+ */
+ public final RestConverterList.Builder converters() {
+ if (converters == null)
+ converters = createConverters(beanStore(), resource());
+ return converters;
+ }
+
+ /**
+ * Response converters.
+ *
+ * <p>
+ * Associates one or more {@link RestConverter converters} with a
resource class.
+ * <br>These converters get called immediately after execution of the
REST method in the same order specified in the
+ * annotation.
+ * <br>The object passed into this converter is the object returned
from the Java method or passed into
+ * the {@link RestResponse#setOutput(Object)} method.
+ *
+ * <p>
+ * Can be used for performing post-processing on the response object
before serialization.
+ *
+ * <p>
+ * When multiple converters are specified, they're executed in the
order they're specified in the annotation
+ * (e.g. first the results will be traversed, then the resulting
node will be searched/sorted).
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bcode w800'>
+ * <jc>// Our converter.</jc>
+ * <jk>public class</jk> MyConverter <jk>implements</jk>
RestConverter {
+ * <ja>@Override</ja>
+ * <jk>public</jk> Object convert(RestRequest
<jv>req</jv>, Object <jv>o</jv>) {
+ * <jc>// Do something with object and return
another object.</jc>
+ * <jc>// Or just return the same object for a
no-op.</jc>
+ * }
+ * }
+ *
+ * <jc>// Option #1 - Registered via annotation resolving to a
config file setting with default value.</jc>
+ * <ja>@Rest</ja>(converters={MyConverter.<jk>class</jk>})
+ * <jk>public class</jk> MyResource {
+ *
+ * <jc>// Option #2 - Registered via builder passed in
through resource constructor.</jc>
+ * <jk>public</jk> MyResource(RestContextBuilder
<jv>builder</jv>) <jk>throws</jk> Exception {
+ *
+ * <jc>// Using method on builder.</jc>
+ *
<jv>builder</jv>.converters(MyConverter.<jk>class</jk>);
+ *
+ * <jc>// Pass in an instance instead.</jc>
+ * <jv>builder</jv>.converters(<jk>new</jk>
MyConverter());
+ * }
+ *
+ * <jc>// Option #3 - Registered via builder passed in
through init method.</jc>
+ * <ja>@RestHook</ja>(<jsf>INIT</jsf>)
+ * <jk>public void</jk> init(RestContextBuilder
<jv>builder</jv>) <jk>throws</jk> Exception {
+ *
<jv>builder</jv>.converters(MyConverter.<jk>class</jk>);
+ * }
+ * }
+ * </p>
+ *
+ * <ul class='notes'>
+ * <li>
+ * When defined as a class, the implementation must have
one of the following constructors:
+ * <ul>
+ * <li><code><jk>public</jk> T(BeanContext)</code>
+ * <li><code><jk>public</jk> T()</code>
+ * <li><code><jk>public static</jk> T
<jsm>create</jsm>(RestContext)</code>
+ * <li><code><jk>public static</jk> T
<jsm>create</jsm>()</code>
+ * </ul>
+ * <li>
+ * Inner classes of the REST resource class are allowed.
+ * </ul>
+ *
+ * <ul class='seealso'>
+ * <li class='jc'>{@link Traversable} - Allows URL additional path
info to address individual elements in a POJO tree.
+ * <li class='jc'>{@link Queryable} - Allows query/view/sort
functions to be performed on POJOs.
+ * <li class='jc'>{@link Introspectable} - Allows Java public
methods to be invoked on the returned POJOs.
+ * <li class='ja'>{@link Rest#converters()}
+ * <li class='link'>{@doc RestConverters}
+ * </ul>
+ *
+ * @param beanStore
+ * The factory used for creating beans and retrieving injected
beans.
+ * @param resource
+ * The REST servlet/bean instance that this context is defined
against.
+ * @return The rest converter list builder for this REST method.
+ */
+ protected RestConverterList.Builder createConverters(BeanStore
beanStore, Supplier<?> resource) {
+
+ // Default value.
+ Value<RestConverterList.Builder> v = Value.of(
+ RestConverterList
+ .create()
+ .beanStore(beanStore)
+ );
+
+ // Specify the implementation class if its set as a default.
+ defaultClasses()
+ .get(RestConverterList.class)
+ .ifPresent(x -> v.get().type(x));
+
+ // Replace with builder from bean store.
+ beanStore
+ .getBean(RestConverterList.Builder.class)
+ .map(x -> x.copy())
+ .ifPresent(x->v.set(x));
+
+ // Replace with bean from bean store.
+ beanStore
+ .getBean(RestConverterList.class)
+ .ifPresent(x->v.get().impl(x));
+
+ // Replace with builder from: public [static]
RestConverterList.Builder createConverters(<args>)
+ beanStore
+ .beanCreateMethodFinder(RestConverterList.Builder.class)
+ .addBean(RestConverterList.Builder.class, v.get())
+ .find("createConverters")
+ .run(x -> v.set(x));
+
+ // Replace with bean from: public [static] RestConverterList
createConverters(<args>)
+ beanStore
+ .beanCreateMethodFinder(RestConverterList.class)
+ .addBean(RestConverterList.Builder.class, v.get())
+ .find("createConverters")
+ .run(x -> v.get().impl(x));
+
+ return v.get();
+ }
+
+ /**
* When enabled, append <js>"/*"</js> to path patterns if not already
present.
*
* @return This object (for method chaining).
@@ -350,103 +536,6 @@ public class RestOpContextBuilder extends
BeanContextBuilder {
}
/**
- * Response converters.
- *
- * <p>
- * Associates one or more {@link RestConverter converters} with a
resource class.
- * <br>These converters get called immediately after execution of the
REST method in the same order specified in the
- * annotation.
- * <br>The object passed into this converter is the object returned
from the Java method or passed into
- * the {@link RestResponse#setOutput(Object)} method.
- *
- * <p>
- * Can be used for performing post-processing on the response object
before serialization.
- *
- * <p>
- * When multiple converters are specified, they're executed in the
order they're specified in the annotation
- * (e.g. first the results will be traversed, then the resulting
node will be searched/sorted).
- *
- * <h5 class='section'>Example:</h5>
- * <p class='bcode w800'>
- * <jc>// Our converter.</jc>
- * <jk>public class</jk> MyConverter <jk>implements</jk>
RestConverter {
- * <ja>@Override</ja>
- * <jk>public</jk> Object convert(RestRequest
<jv>req</jv>, Object <jv>o</jv>) {
- * <jc>// Do something with object and return
another object.</jc>
- * <jc>// Or just return the same object for a
no-op.</jc>
- * }
- * }
- *
- * <jc>// Option #1 - Registered via annotation resolving to a
config file setting with default value.</jc>
- * <ja>@Rest</ja>(converters={MyConverter.<jk>class</jk>})
- * <jk>public class</jk> MyResource {
- *
- * <jc>// Option #2 - Registered via builder passed in
through resource constructor.</jc>
- * <jk>public</jk> MyResource(RestContextBuilder
<jv>builder</jv>) <jk>throws</jk> Exception {
- *
- * <jc>// Using method on builder.</jc>
- *
<jv>builder</jv>.converters(MyConverter.<jk>class</jk>);
- *
- * <jc>// Pass in an instance instead.</jc>
- * <jv>builder</jv>.converters(<jk>new</jk>
MyConverter());
- * }
- *
- * <jc>// Option #3 - Registered via builder passed in
through init method.</jc>
- * <ja>@RestHook</ja>(<jsf>INIT</jsf>)
- * <jk>public void</jk> init(RestContextBuilder
<jv>builder</jv>) <jk>throws</jk> Exception {
- *
<jv>builder</jv>.converters(MyConverter.<jk>class</jk>);
- * }
- * }
- * </p>
- *
- * <ul class='notes'>
- * <li>
- * When defined as a class, the implementation must have
one of the following constructors:
- * <ul>
- * <li><code><jk>public</jk> T(BeanContext)</code>
- * <li><code><jk>public</jk> T()</code>
- * <li><code><jk>public static</jk> T
<jsm>create</jsm>(RestContext)</code>
- * <li><code><jk>public static</jk> T
<jsm>create</jsm>()</code>
- * </ul>
- * <li>
- * Inner classes of the REST resource class are allowed.
- * </ul>
- *
- * <ul class='seealso'>
- * <li class='jc'>{@link Traversable} - Allows URL additional path
info to address individual elements in a POJO tree.
- * <li class='jc'>{@link Queryable} - Allows query/view/sort
functions to be performed on POJOs.
- * <li class='jc'>{@link Introspectable} - Allows Java public
methods to be invoked on the returned POJOs.
- * <li class='ja'>{@link Rest#converters()}
- * <li class='link'>{@doc RestConverters}
- * </ul>
- *
- *
- * @param values The values to add to this setting.
- * @return This object (for method chaining).
- * @throws IllegalArgumentException if any class does not extend from
{@link RestConverter}.
- */
- @FluentSetter
- public RestOpContextBuilder converters(Class<?>...values) {
- converters.append(assertClassArrayArgIsType("values",
RestConverter.class, values));
- return this;
- }
-
- /**
- * Response converters.
- *
- * <p>
- * Same as {@link #converters(Class...)} except input is
pre-constructed instances.
- *
- * @param values The values to add to this setting.
- * @return This object (for method chaining).
- */
- @FluentSetter
- public RestOpContextBuilder converters(RestConverter...values) {
- converters.append(values);
- return this;
- }
-
- /**
* Debug mode.
*
* <p>
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
index 8e4e610..ad85cb9 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
@@ -311,7 +311,7 @@ public @interface Rest {
* Associates one or more {@link RestConverter converters} with a
resource class.
*
* <ul class='seealso'>
- * <li class='jm'>{@link
RestOpContextBuilder#converters(Class...)} - Registering converters with REST
resources.
+ * <li class='jm'>{@link RestOpContextBuilder#converters()} -
Registering converters with REST resources.
* </ul>
*/
Class<? extends RestConverter>[] converters() default {};
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
index 06dd5b3..6296221 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
@@ -1123,7 +1123,7 @@ public class RestAnnotation {
strings(a.produces()).map(MediaType::of).forEach(x ->
b.produces(x));
strings(a.consumes()).map(MediaType::of).forEach(x ->
b.consumes(x));
- b.converters(a.converters());
+ b.converters().append(a.converters());
b.guards(a.guards());
string(a.defaultCharset()).map(Charset::forName).ifPresent(x ->
b.defaultCharset(x));
string(a.maxInput()).ifPresent(x -> b.maxInput(x));
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestGet.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestGet.java
index f04aa80..3ad5a06 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestGet.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestGet.java
@@ -121,7 +121,7 @@ public @interface RestGet {
* Associates one or more {@link RestConverter converters} with this
method.
*
* <ul class='seealso'>
- * <li class='jm'>{@link
RestOpContextBuilder#converters(Class...)} - Registering converters with REST
resources.
+ * <li class='jm'>{@link RestOpContextBuilder#converters()} -
Registering converters with REST resources.
* </ul>
*/
Class<? extends RestConverter>[] converters() default {};
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestGetAnnotation.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestGetAnnotation.java
index 808264e..270420e 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestGetAnnotation.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestGetAnnotation.java
@@ -535,7 +535,7 @@ public class RestGetAnnotation {
strings(a.defaultRequestAttributes()).map(x ->
BasicNamedAttribute.ofPair(x)).forEach(x -> b.defaultRequestAttributes(x));
strings(a.defaultQueryData()).map(x ->
basicPart(x)).forEach(x -> b.defaultQueryData(x));
string(a.defaultAccept()).map(x ->
accept(x)).ifPresent(x -> b.defaultRequestHeaders(x));
- b.converters(a.converters());
+ b.converters().append(a.converters());
b.guards(a.guards());
b.matchers(a.matchers());
string(a.clientVersion()).ifPresent(x ->
b.clientVersion(x));
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOp.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOp.java
index 0fad7a8..6b10682 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOp.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOp.java
@@ -138,7 +138,7 @@ public @interface RestOp {
* Associates one or more {@link RestConverter converters} with this
method.
*
* <ul class='seealso'>
- * <li class='jm'>{@link
RestOpContextBuilder#converters(Class...)} - Registering converters with REST
resources.
+ * <li class='jm'>{@link RestOpContextBuilder#converters()} -
Registering converters with REST resources.
* </ul>
*/
Class<? extends RestConverter>[] converters() default {};
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOpAnnotation.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOpAnnotation.java
index 932109e..26d305d 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOpAnnotation.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOpAnnotation.java
@@ -642,7 +642,7 @@ public class RestOpAnnotation {
strings(a.defaultFormData()).map(x ->
basicPart(x)).forEach(x -> b.defaultFormData(x));
string(a.defaultAccept()).map(x ->
accept(x)).ifPresent(x -> b.defaultRequestHeaders(x));
string(a.defaultContentType()).map(x ->
contentType(x)).ifPresent(x -> b.defaultRequestHeaders(x));
- b.converters(a.converters());
+ b.converters().append(a.converters());
b.guards(a.guards());
b.matchers(a.matchers());
string(a.clientVersion()).ifPresent(x ->
b.clientVersion(x));
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPost.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPost.java
index 061266b..39e48cc 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPost.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPost.java
@@ -140,7 +140,7 @@ public @interface RestPost {
* Associates one or more {@link RestConverter converters} with this
method.
*
* <ul class='seealso'>
- * <li class='jm'>{@link
RestOpContextBuilder#converters(Class...)} - Registering converters with REST
resources.
+ * <li class='jm'>{@link RestOpContextBuilder#converters()} -
Registering converters with REST resources.
* </ul>
*/
Class<? extends RestConverter>[] converters() default {};
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPostAnnotation.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPostAnnotation.java
index 7fe33a4..094bb36 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPostAnnotation.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPostAnnotation.java
@@ -626,7 +626,7 @@ public class RestPostAnnotation {
strings(a.defaultFormData()).map(x ->
basicPart(x)).forEach(x -> b.defaultFormData(x));
string(a.defaultAccept()).map(x ->
accept(x)).ifPresent(x -> b.defaultRequestHeaders(x));
string(a.defaultContentType()).map(x ->
contentType(x)).ifPresent(x -> b.defaultRequestHeaders(x));
- b.converters(a.converters());
+ b.converters().append(a.converters());
b.guards(a.guards());
b.matchers(a.matchers());
string(a.clientVersion()).ifPresent(x ->
b.clientVersion(x));
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPut.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPut.java
index 1b138ca..8aed45b 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPut.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPut.java
@@ -140,7 +140,7 @@ public @interface RestPut {
* Associates one or more {@link RestConverter converters} with this
method.
*
* <ul class='seealso'>
- * <li class='jm'>{@link
RestOpContextBuilder#converters(Class...)} - Registering converters with REST
resources.
+ * <li class='jm'>{@link RestOpContextBuilder#converters()} -
Registering converters with REST resources.
* </ul>
*/
Class<? extends RestConverter>[] converters() default {};
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPutAnnotation.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPutAnnotation.java
index cd036c9..1b7d856 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPutAnnotation.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPutAnnotation.java
@@ -626,7 +626,7 @@ public class RestPutAnnotation {
strings(a.defaultFormData()).map(x ->
basicPart(x)).forEach(x -> b.defaultFormData(x));
string(a.defaultAccept()).map(x ->
accept(x)).ifPresent(x -> b.defaultRequestHeaders(x));
string(a.defaultContentType()).map(x ->
contentType(x)).ifPresent(x -> b.defaultRequestHeaders(x));
- b.converters(a.converters());
+ b.converters().append(a.converters());
b.guards(a.guards());
b.matchers(a.matchers());
string(a.clientVersion()).ifPresent(x ->
b.clientVersion(x));
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Introspectable.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Introspectable.java
index 619f30d..41d1bb4 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Introspectable.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Introspectable.java
@@ -43,7 +43,7 @@ import org.apache.juneau.utils.*;
*
* <ul class='seealso'>
* <li class='jc'>{@link PojoIntrospector} - Additional information on
introspection of POJO methods.
- * <li class='jm'>{@link RestOpContextBuilder#converters(Class...)} -
Registering converters with REST resources.
+ * <li class='jm'>{@link RestOpContextBuilder#converters()} - Registering
converters with REST resources.
* <li class='link'>{@doc RestConverters}
* </ul>
*/
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Queryable.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Queryable.java
index 55890b2..cde4264 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Queryable.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Queryable.java
@@ -64,7 +64,7 @@ import org.apache.juneau.utils.*;
*
* <ul class='seealso'>
* <li class='jc'>{@link PojoQuery} - Additional information on filtering
POJO models.
- * <li class='jm'>{@link RestOpContextBuilder#converters(Class...)} -
Registering converters with REST resources.
+ * <li class='jm'>{@link RestOpContextBuilder#converters()} - Registering
converters with REST resources.
* <li class='link'>{@doc RestConverters}
* </ul>
*/
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Traversable.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Traversable.java
index cccc07a..ccd67bf 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Traversable.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Traversable.java
@@ -37,7 +37,7 @@ import org.apache.juneau.utils.*;
*
* <ul class='seealso'>
* <li class='jc'>{@link PojoRest} - Additional information on addressing
elements in a POJO tree using URL notation.
- * <li class='jm'>{@link RestOpContextBuilder#converters(Class...)} -
Registering converters with REST resources.
+ * <li class='jm'>{@link RestOpContextBuilder#converters()} - Registering
converters with REST resources.
* <li class='link'>{@doc RestConverters}
* </ul>
*/