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 4611d01 Context API refactoring.
4611d01 is described below
commit 4611d01b29564d2ad9dfc3cd2c2d95a59abeaa54
Author: JamesBognar <[email protected]>
AuthorDate: Sun Aug 29 16:00:50 2021 -0400
Context API refactoring.
---
.../java/org/apache/juneau/rest/RestContext.java | 96 ---------------------
.../org/apache/juneau/rest/RestContextBuilder.java | 36 --------
.../java/org/apache/juneau/rest/RestConverter.java | 8 +-
.../org/apache/juneau/rest/RestConverterList.java | 96 +++++++++++++++++++--
.../java/org/apache/juneau/rest/RestOpContext.java | 25 +++---
.../apache/juneau/rest/RestOpContextBuilder.java | 99 ++++++++++++++++++++++
.../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 +-
19 files changed, 216 insertions(+), 170 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 8d2f9bc..2922099 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
@@ -64,7 +64,6 @@ import org.apache.juneau.plaintext.*;
import org.apache.juneau.reflect.*;
import org.apache.juneau.rest.annotation.*;
import org.apache.juneau.rest.args.*;
-import org.apache.juneau.rest.converters.*;
import org.apache.juneau.rest.logging.*;
import org.apache.juneau.http.header.*;
import org.apache.juneau.http.response.*;
@@ -150,101 +149,6 @@ public class RestContext extends BeanContext {
public static final String REST_beanStore = PREFIX + ".beanStore.o";
/**
- * Configuration property: Class-level response converters.
- *
- * <h5 class='section'>Property:</h5>
- * <ul class='spaced-list'>
- * <li><b>ID:</b> {@link
org.apache.juneau.rest.RestContext#REST_converters REST_converters}
- * <li><b>Name:</b> <js>"RestContext.converters.lo"</js>
- * <li><b>Data type:</b> <c>List<{@link
org.apache.juneau.rest.RestConverter}|Class<{@link
org.apache.juneau.rest.RestConverter}>></c>
- * <li><b>Default:</b> empty list
- * <li><b>Session property:</b> <jk>false</jk>
- * <li><b>Annotations:</b>
- * <ul>
- * <li class='ja'>{@link
org.apache.juneau.rest.annotation.Rest#converters()}
- * <li class='ja'>{@link
org.apache.juneau.rest.annotation.RestOp#converters()}
- * </ul>
- * <li><b>Methods:</b>
- * <ul>
- * <li class='jm'>{@link
org.apache.juneau.rest.RestContextBuilder#converters(Class...)}
- * <li class='jm'>{@link
org.apache.juneau.rest.RestContextBuilder#converters(RestConverter...)}
- * </ul>
- * </ul>
- *
- * <h5 class='section'>Description:</h5>
- * <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>// Same, but using property.</jc>
- *
<jv>builder</jv>.set(<jsf>REST_converters</jsf>, 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='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='link'>{@doc RestConverters}
- * </ul>
- *
- * <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>
- */
- public static final String REST_converters = PREFIX + ".converters.lo";
-
- /**
* Configuration property: Debug mode.
*
* <h5 class='section'>Property:</h5>
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
index d8893db..03fef47 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
@@ -1035,42 +1035,6 @@ public class RestContextBuilder extends
BeanContextBuilder implements ServletCon
}
/**
- * <i><l>RestContext</l> configuration property: </i> Class-level
response converters.
- *
- * <p>
- * Associates one or more {@link RestConverter converters} with a
resource class.
- *
- * <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_converters}
- * </ul>
- *
- * @param values The values to add to this setting.
- * @return This object (for method chaining).
- */
- @FluentSetter
- public RestContextBuilder converters(Class<?>...values) {
- return prependTo(REST_converters, values);
- }
-
- /**
- * <i><l>RestContext</l> configuration property: </i> Response
converters.
- *
- * <p>
- * Same as {@link #converters(Class...)} except input is
pre-constructed instances.
- *
- * <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_converters}
- * </ul>
- *
- * @param values The values to add to this setting.
- * @return This object (for method chaining).
- */
- @FluentSetter
- public RestContextBuilder converters(RestConverter...values) {
- return prependTo(REST_converters, values);
- }
-
- /**
* <i><l>RestContext</l> configuration property: </i> Debug mode.
*
* <p>
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 9fd6416..76c095b 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,9 +29,8 @@ import org.apache.juneau.serializer.*;
* <ul class='javatree'>
* <li class='ja'>{@link Rest#converters()}
* <li class='ja'>{@link RestOp#converters()}
- * <li class='jf'>{@link RestContext#REST_converters}
- * <li class='jm'>{@link RestContextBuilder#converters(Class...)}
- * <li class='jm'>{@link RestContextBuilder#converters(RestConverter...)}
+ * <li class='jm'>{@link RestOpContextBuilder#converters(Class...)}
+ * <li class='jm'>{@link RestOpContextBuilder#converters(RestConverter...)}
* </ul>
*
* <h5 class='section'>Example:</h5>
@@ -74,7 +73,8 @@ import org.apache.juneau.serializer.*;
* </ul>
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_converters} - Registering
converters with REST resources.
+ * <li class='jm'>{@link RestOpContextBuilder#converters(Class...)}
+ * <li class='jm'>{@link RestOpContextBuilder#converters(RestConverter...)}
* <li class='link'>{@doc RestConverters}
* </ul>
*/
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConverterList.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConverterList.java
index 83904da..3bf6130 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConverterList.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConverterList.java
@@ -12,23 +12,107 @@
//
***************************************************************************************************************************
package org.apache.juneau.rest;
+import org.apache.juneau.*;
import org.apache.juneau.collections.*;
+import org.apache.juneau.cp.*;
/**
* A list of {@link RestConverter} objects.
*/
-public class RestConverterList extends AList<RestConverter> {
+public class RestConverterList {
- private static final long serialVersionUID = 1L;
+ private final RestConverter[] entries;
/**
* Static creator.
*
* @return An empty list.
*/
- @SuppressWarnings("unchecked")
- public static RestConverterList create() {
- return new RestConverterList();
+ public static Builder create() {
+ return new Builder();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param builder The builder containing the contents for this list.
+ */
+ protected RestConverterList(Builder builder) {
+ entries =
+ builder
+ .entries
+ .stream()
+ .map(x -> instantiate(x, builder.beanStore))
+ .toArray(RestConverter[]::new);
+ }
+
+ /**
+ * Builder for {@link RestConverterList} objects.
+ */
+ public static class Builder {
+
+ AList<Object> entries;
+ BeanStore beanStore;
+
+ /**
+ * Create an empty builder.
+ */
+ protected Builder() {
+ this.entries = AList.create();
+ }
+
+ /**
+ * Creates a new {@link RestConverterList} object using a
snapshot of the settings defined in this builder.
+ *
+ * @return A new {@link RestConverterList} object.
+ */
+ public RestConverterList build() {
+ return new RestConverterList(this);
+ }
+
+ /**
+ * Appends the specified rest matcher classes to the list.
+ *
+ * @param values The values to add.
+ * @return This object (for method chaining).
+ */
+ @SuppressWarnings("unchecked")
+ public Builder append(Class<? extends RestConverter>...values) {
+ entries.append((Object[])values);
+ return this;
+ }
+
+ /**
+ * Appends the specified rest matcher objects to the list.
+ *
+ * @param values The values to add.
+ * @return This object (for method chaining).
+ */
+ public Builder append(RestConverter...values) {
+ entries.append((Object[])values);
+ return this;
+ }
+
+ /**
+ * Specifies the bean store to use for instantiating rest
matcher classes.
+ *
+ * @param value The bean store to use for instantiating rest
matcher classes.
+ * @return This object (for method chaining).
+ */
+ public Builder beanStore(BeanStore value) {
+ beanStore = value;
+ return this;
+ }
+ }
+
+ private static RestConverter instantiate(Object o, BeanStore bs) {
+ if (o instanceof RestConverter)
+ return (RestConverter)o;
+ try {
+ return (RestConverter)bs.createBean((Class<?>)o);
+ } catch (ExecutableException e) {
+ throw new ConfigException(e, "Could not instantiate
class {0}", o);
+ }
}
/**
@@ -37,6 +121,6 @@ public class RestConverterList extends AList<RestConverter> {
* @return The contents of this list as a {@link RestConverter} array.
*/
public RestConverter[] asArray() {
- return asArrayOf(RestConverter.class);
+ return entries;
}
}
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 11f46a0..13cd929 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
@@ -161,7 +161,7 @@ public class RestOpContext extends BeanContext implements
Comparable<RestOpConte
partParser = createPartParser(r, cp, bs);
bs.addBean(HttpPartParser.class, partParser);
- converters = createConverters(r, cp, bs).asArray();
+ converters = createConverters(r, builder, bs).asArray();
bs.addBean(RestConverter[].class, converters);
guards = createGuards(r, builder, bs).asArray();
@@ -225,9 +225,9 @@ public class RestOpContext extends BeanContext implements
Comparable<RestOpConte
* <p>
* Instantiates based on the following logic:
* <ul>
- * <li>Looks for {@link RestContext#REST_converters} value set via
any of the following:
+ * <li>Looks for REST conveters set via any of the following:
* <ul>
- * <li>{@link
RestContextBuilder#converters(Class...)}/{@link
RestContextBuilder#converters(RestConverter...)}
+ * <li>{@link
RestOpContextBuilder#converters(Class...)}/{@link
RestOpContextBuilder#converters(RestConverter...)}
* <li>{@link RestOp#converters()}.
* <li>{@link Rest#converters()}.
* </ul>
@@ -244,31 +244,26 @@ public class RestOpContext extends BeanContext implements
Comparable<RestOpConte
* </ul>
*
* @param resource The REST resource object.
- * @param properties TODO
+ * @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 RestContext#REST_converters
+ * @see RestOpContextBuilder#converters(Class...)
*/
- protected RestConverterList createConverters(Object resource,
ContextProperties properties, BeanStore beanStore) throws Exception {
-
- RestConverterList x = RestConverterList.create();
-
- x.append(properties.getInstanceArray(REST_converters,
RestConverter.class, beanStore).orElse(new RestConverter[0]));
+ protected RestConverterList createConverters(Object resource,
RestOpContextBuilder builder, BeanStore beanStore) throws Exception {
- if (x.isEmpty())
- x =
beanStore.getBean(RestConverterList.class).orElse(x);
+ RestConverterList.Builder x =
builder.converters.beanStore(beanStore);
x = BeanStore
.of(beanStore, resource)
- .addBean(RestConverterList.class, x)
- .beanCreateMethodFinder(RestConverterList.class,
resource)
+ .addBean(RestConverterList.Builder.class, x)
+
.beanCreateMethodFinder(RestConverterList.Builder.class, resource)
.find("createConverters", Method.class)
.thenFind("createConverters")
.withDefault(x)
.run();
- return x;
+ return x.build();
}
/**
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 c5e70a2..fc22448 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
@@ -27,6 +27,7 @@ import org.apache.juneau.http.response.*;
import org.apache.juneau.internal.*;
import org.apache.juneau.reflect.*;
import org.apache.juneau.rest.annotation.*;
+import org.apache.juneau.rest.converters.*;
import org.apache.juneau.svl.*;
import java.lang.reflect.Method;
import java.nio.charset.*;
@@ -49,6 +50,7 @@ public class RestOpContextBuilder extends BeanContextBuilder {
List<MediaType> produces, consumes;
Set<String> roleGuard, rolesDeclared;
RestGuardList.Builder guards = RestGuardList.create();
+ RestConverterList.Builder converters = RestConverterList.create();
Charset defaultCharset;
Long maxInput;
@@ -216,6 +218,103 @@ 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).
+ */
+ @SuppressWarnings("unchecked")
+ @FluentSetter
+ public RestOpContextBuilder converters(Class<? extends
RestConverter>...values) {
+ converters.append(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 70c2b0b..c28bf28 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
@@ -291,7 +291,7 @@ public @interface Rest {
* Associates one or more {@link RestConverter converters} with a
resource class.
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_converters}
+ * <li class='jm'>{@link
RestOpContextBuilder#converters(Class...)} - 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 3f64b66..a7650fb 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
@@ -1105,7 +1105,7 @@ public class RestAnnotation {
b.prependTo(REST_encoders, a.encoders());
stringStream(a.produces()).map(MediaType::of).forEach(x
-> b.produces(x));
stringStream(a.consumes()).map(MediaType::of).forEach(x
-> b.consumes(x));
- b.prependTo(REST_converters, a.converters());
+ b.converters(a.converters());
b.guards(a.guards());
value(a.defaultCharset()).map(Charset::forName).ifPresent(x ->
b.defaultCharset(x));
value(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 5fcb202..2c79a1d 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
@@ -119,7 +119,7 @@ public @interface RestGet {
* Associates one or more {@link RestConverter converters} with this
method.
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_converters}
+ * <li class='jm'>{@link
RestOpContextBuilder#converters(Class...)} - 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 8db30b5..b2d4016 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
@@ -519,7 +519,7 @@ public class RestGetAnnotation {
stringStream(a.defaultRequestAttributes()).map(x ->
BasicNamedAttribute.ofPair(x)).forEach(x -> b.defaultRequestAttributes(x));
stringStream(a.defaultQueryData()).map(x ->
basicPart(x)).forEach(x -> b.defaultQueryData(x));
b.appendToIfNotEmpty(REST_defaultRequestHeaders,
accept(string(a.defaultAccept())));
- b.prependTo(REST_converters, a.converters());
+ b.converters(a.converters());
b.guards(a.guards());
b.matchers(a.matchers());
value(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 f952c35..e9c92f2 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
@@ -135,7 +135,7 @@ public @interface RestOp {
* Associates one or more {@link RestConverter converters} with this
method.
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_converters}
+ * <li class='jm'>{@link
RestOpContextBuilder#converters(Class...)} - 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 a709fde..102f6ae 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
@@ -623,7 +623,7 @@ public class RestOpAnnotation {
stringStream(a.defaultFormData()).map(x ->
basicPart(x)).forEach(x -> b.defaultFormData(x));
b.appendToIfNotEmpty(REST_defaultRequestHeaders,
accept(string(a.defaultAccept())));
b.appendToIfNotEmpty(REST_defaultRequestHeaders,
contentType(string(a.defaultContentType())));
- b.prependTo(REST_converters, a.converters());
+ b.converters(a.converters());
b.guards(a.guards());
b.matchers(a.matchers());
value(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 3e3e1ac..a787b90 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
@@ -137,7 +137,7 @@ public @interface RestPost {
* Associates one or more {@link RestConverter converters} with this
method.
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_converters}
+ * <li class='jm'>{@link
RestOpContextBuilder#converters(Class...)} - 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 cb9d910..cb329c7 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
@@ -608,7 +608,7 @@ public class RestPostAnnotation {
stringStream(a.defaultFormData()).map(x ->
basicPart(x)).forEach(x -> b.defaultFormData(x));
b.appendToIfNotEmpty(REST_defaultRequestHeaders,
accept(string(a.defaultAccept())));
b.appendToIfNotEmpty(REST_defaultRequestHeaders,
contentType(string(a.defaultContentType())));
- b.prependTo(REST_converters, a.converters());
+ b.converters(a.converters());
b.guards(a.guards());
b.matchers(a.matchers());
value(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 5fa3084..156a447 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
@@ -137,7 +137,7 @@ public @interface RestPut {
* Associates one or more {@link RestConverter converters} with this
method.
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_converters}
+ * <li class='jm'>{@link
RestOpContextBuilder#converters(Class...)} - 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 8459b51..46fd32b 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
@@ -608,7 +608,7 @@ public class RestPutAnnotation {
stringStream(a.defaultFormData()).map(x ->
basicPart(x)).forEach(x -> b.defaultFormData(x));
b.appendToIfNotEmpty(REST_defaultRequestHeaders,
accept(string(a.defaultAccept())));
b.appendToIfNotEmpty(REST_defaultRequestHeaders,
contentType(string(a.defaultContentType())));
- b.prependTo(REST_converters, a.converters());
+ b.converters(a.converters());
b.guards(a.guards());
b.matchers(a.matchers());
value(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 b53b3a7..619f30d 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='jf'>{@link RestContext#REST_converters} - Registering
converters with REST resources.
+ * <li class='jm'>{@link RestOpContextBuilder#converters(Class...)} -
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 7375d06..55890b2 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='jf'>{@link RestContext#REST_converters} - Registering
converters with REST resources.
+ * <li class='jm'>{@link RestOpContextBuilder#converters(Class...)} -
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 2adae4b..cccc07a 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='jf'>{@link RestContext#REST_converters} - Registering
converters with REST resources.
+ * <li class='jm'>{@link RestOpContextBuilder#converters(Class...)} -
Registering converters with REST resources.
* <li class='link'>{@doc RestConverters}
* </ul>
*/