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 42f217c Context API refactoring.
42f217c is described below
commit 42f217c94ea8a7a6c75f4aac98d6b2a7b8b522d8
Author: JamesBognar <[email protected]>
AuthorDate: Sat Sep 11 20:02:33 2021 -0400
Context API refactoring.
---
.../src/main/java/org/apache/juneau/Value.java | 1 -
.../org/apache/juneau/rest/ResponseProcessor.java | 3 +-
.../apache/juneau/rest/ResponseProcessorList.java | 49 +++-
.../java/org/apache/juneau/rest/RestContext.java | 65 +----
.../org/apache/juneau/rest/RestContextBuilder.java | 303 +++++++++++++--------
.../java/org/apache/juneau/rest/RestResponse.java | 2 +-
.../org/apache/juneau/rest/annotation/Rest.java | 2 +-
.../juneau/rest/annotation/RestAnnotation.java | 2 +-
8 files changed, 234 insertions(+), 193 deletions(-)
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Value.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Value.java
index 21a645f..f55e57d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Value.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Value.java
@@ -194,5 +194,4 @@ public class Value<T> {
(t instanceof ParameterizedType &&
((ParameterizedType)t).getRawType() == Value.class)
|| (t instanceof Class &&
Value.class.isAssignableFrom((Class<?>)t));
}
-
}
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessor.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessor.java
index ccf3011..29f135c 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessor.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessor.java
@@ -30,8 +30,7 @@ import org.apache.juneau.rest.annotation.*;
* Response processors can be associated with REST resources via the following:
* <ul>
* <li class='ja'>{@link Rest#responseProcessors}
- * <li class='jm'>{@link RestContextBuilder#responseProcessors(Class...)}
- * <li class='jm'>{@link
RestContextBuilder#responseProcessors(ResponseProcessor...)}
+ * <li class='jm'>{@link RestContextBuilder#responseProcessors()}
* </ul>
*
* <p>
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessorList.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessorList.java
index a09c353..80d0c4c 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessorList.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessorList.java
@@ -13,6 +13,9 @@
package org.apache.juneau.rest;
import static org.apache.juneau.assertions.Assertions.*;
+
+import java.util.*;
+
import static java.util.Arrays.*;
import org.apache.juneau.*;
@@ -54,22 +57,34 @@ public class ResponseProcessorList {
*/
public static class Builder {
- AList<Object> entries;
- BeanStore beanStore;
+ List<Object> entries;
+ ResponseProcessorList impl;
+ BeanStore beanStore = BeanStore.INSTANCE;
/**
- * Create an empty builder.
+ * Constructor.
*/
protected Builder() {
this.entries = AList.create();
}
/**
+ * Copy constructor.
+ *
+ * @param copyFrom The builder to copy.
+ */
+ protected Builder(Builder copyFrom) {
+ this.entries = AList.create().append(copyFrom.entries);
+ }
+
+ /**
* Creates a new {@link ResponseProcessorList} object using a
snapshot of the settings defined in this builder.
*
* @return A new {@link ResponseProcessorList} object.
*/
public ResponseProcessorList build() {
+ if (impl != null)
+ return impl;
return new ResponseProcessorList(this);
}
@@ -77,7 +92,7 @@ public class ResponseProcessorList {
* Appends the specified rest response processor classes to the
list.
*
* @param values The values to add.
- * @return This object (for method chaining).
+ * @return This object.
* @throws IllegalArgumentException if any class does not
extend from {@link ResponseProcessor}.
*/
public Builder add(Class<?>...values) {
@@ -89,9 +104,9 @@ public class ResponseProcessorList {
* Appends the specified rest response processor objects to the
list.
*
* @param values The values to add.
- * @return This object (for method chaining).
+ * @return This object.
*/
- public Builder append(ResponseProcessor...values) {
+ public Builder add(ResponseProcessor...values) {
entries.addAll(asList(values));
return this;
}
@@ -100,12 +115,32 @@ public class ResponseProcessorList {
* Specifies the bean store to use for instantiating rest
response processor classes.
*
* @param value The bean store to use for instantiating rest
response processor classes.
- * @return This object (for method chaining).
+ * @return This object.
*/
public Builder beanStore(BeanStore value) {
beanStore = value;
return this;
}
+
+ /**
+ * Specifies a pre-instantiated bean to return from {@link
#build()}.
+ *
+ * @param value The value for this setting.
+ * @return This object.
+ */
+ public Builder impl(ResponseProcessorList value) {
+ this.impl = value;
+ return this;
+ }
+
+ /**
+ * Creates a copy of this builder.
+ *
+ * @return A copy of this builder.
+ */
+ public Builder copy() {
+ return new Builder(this);
+ }
}
private static ResponseProcessor instantiate(Object o, BeanStore bs) {
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 39f8200..4699829 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
@@ -247,32 +247,24 @@ public class RestContext extends Context {
parentContext = builder.parentContext;
rootBeanStore = builder.beanStore();
- beanStore = rootBeanStore.copy().build();
+ BeanStore bs = beanStore = rootBeanStore.copy().build();
beanStore
.addBean(BeanStore.class, beanStore)
.addBean(RestContext.class, this)
.addBean(Object.class, resource.get())
.addBean(RestContextBuilder.class, builder)
.addBean(AnnotationWorkList.class,
builder.getApplied());
- BeanStore bs = beanStore;
logger = bs.add(Logger.class, builder.logger());
thrownStore = bs.add(ThrownStore.class,
builder.thrownStore().build());
methodExecStore = bs.add(MethodExecStore.class,
builder.methodExecStore().thrownStoreOnce(thrownStore).build());
messages = bs.add(Messages.class,
builder.messages().build());
+ varResolver = bs.add(VarResolver.class,
builder.varResolver().bean(Messages.class, messages).build());
+ config = bs.add(Config.class,
builder.config().resolving(varResolver.createSession()));
+ responseProcessors = bs.add(ResponseProcessor[].class,
builder.responseProcessors().build().toArray());
Object r = resource.get();
- VarResolver vr = varResolver = builder
- .varResolver()
- .bean(Messages.class, messages)
- .build();
- bs.addBean(VarResolver.class, vr);
-
- config = bs.add(Config.class,
builder.config().resolving(vr.createSession()));
-
- responseProcessors = createResponseProcessors(r,
builder, bs).toArray();
-
callLoggerDefault = builder.callLoggerDefault;
debugDefault = builder.debugDefault;
@@ -358,7 +350,7 @@ public class RestContext extends Context {
restChildren = createRestChildren(r, builder, bs,
builder.inner);
- swaggerProvider = createSwaggerProvider(r, builder, bs,
fileFinder, messages, vr);
+ swaggerProvider = createSwaggerProvider(r, builder, bs,
fileFinder, messages, varResolver);
} catch (BasicHttpException e) {
_initException = e;
@@ -775,53 +767,6 @@ public class RestContext extends Context {
}
/**
- * Instantiates the response handlers for this REST resource.
- *
- * <p>
- * Instantiates based on the following logic:
- * <ul>
- * <li>Looks for response processors set via any of the following:
- * <ul>
- * <li>{@link
RestContextBuilder#responseProcessors(Class...)}/{@link
RestContextBuilder#responseProcessors(ResponseProcessor...)}
- * <li>{@link Rest#responseProcessors()}.
- * </ul>
- * <li>Looks for a static or non-static
<c>createResponseProcessors()</> method that returns <c>{@link
ResponseProcessor}[]</c> on the
- * resource class with any of the following arguments:
- * <ul>
- * <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>ResponseProcessor[0]</c>.
- * </ul>
- *
- * @param resource
- * The REST servlet or bean that this context defines.
- * @param builder
- * The builder for this object.
- * @param beanStore
- * The factory used for creating beans and retrieving injected
beans.
- * <br>Created by {@link RestContextBuilder#beanStore()}.
- * @return The response handlers for this REST resource.
- * @throws Exception If response handlers could not be instantiated.
- */
- protected ResponseProcessorList createResponseProcessors(Object
resource, RestContextBuilder builder, BeanStore beanStore) throws Exception {
-
- ResponseProcessorList.Builder x =
builder.responseProcessors.beanStore(beanStore);
-
- x = BeanStore
- .of(beanStore, resource)
- .addBean(ResponseProcessorList.Builder.class, x)
-
.beanCreateMethodFinder(ResponseProcessorList.Builder.class, resource)
- .find("createResponseProcessors")
- .withDefault(x)
- .run();
-
- return x.build();
- }
-
- /**
* Instantiates the HTTP part serializer for this REST resource.
*
* <p>
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 7b636ee..b0518bc 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
@@ -126,6 +126,7 @@ public class RestContextBuilder extends ContextBuilder
implements ServletConfig
private ThrownStore.Builder thrownStore;
private MethodExecStore.Builder methodExecStore;
private Messages.Builder messages;
+ private ResponseProcessorList.Builder responseProcessors;
String
allowedHeaderParams = env("RestContext.allowedHeaderParams",
"Accept,Content-Type"),
@@ -167,17 +168,6 @@ public class RestContextBuilder extends ContextBuilder
implements ServletConfig
Enablement debugDefault, debug;
- ResponseProcessorList.Builder responseProcessors =
ResponseProcessorList.create().add(
- ReaderProcessor.class,
- InputStreamProcessor.class,
- ThrowableProcessor.class,
- HttpResponseProcessor.class,
- HttpResourceProcessor.class,
- HttpEntityProcessor.class,
- ResponseBeanProcessor.class,
- PlainTextPojoProcessor.class,
- SerializedPojoProcessor.class
- );
List<Object> children = new ArrayList<>();
@@ -315,6 +305,7 @@ public class RestContextBuilder extends ContextBuilder
implements ServletConfig
runInitHooks(bs, resource());
logger();
messages();
+ responseProcessors();
VarResolverSession vrs = varResolver().build().createSession();
AnnotationWorkList al =
rci.getAnnotationList(ContextApplyFilter.INSTANCE).getWork(vrs);
@@ -1087,6 +1078,187 @@ public class RestContextBuilder extends ContextBuilder
implements ServletConfig
return v.get();
}
+ /**
+ * Returns the builder for the {@link ResponseProcessorList} object in
the REST context.
+ *
+ * <p>
+ * Specifies a list of {@link ResponseProcessor} classes that know how
to convert POJOs returned by REST methods or
+ * set via {@link RestResponse#setOutput(Object)} into appropriate HTTP
responses.
+ *
+ * <p>
+ * By default, the following response handlers are provided in the
specified order:
+ * <ul>
+ * <li class='jc'>{@link ReaderProcessor}
+ * <li class='jc'>{@link InputStreamProcessor}
+ * <li class='jc'>{@link ThrowableProcessor}
+ * <li class='jc'>{@link HttpResponseProcessor}
+ * <li class='jc'>{@link HttpResourceProcessor}
+ * <li class='jc'>{@link HttpEntityProcessor}
+ * <li class='jc'>{@link ResponseBeanProcessor}
+ * <li class='jc'>{@link PlainTextPojoProcessor}
+ * <li class='jc'>{@link SerializedPojoProcessor}
+ * </ul>
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bcode w800'>
+ * <jc>// Our custom response processor for Foo objects. </jc>
+ * <jk>public class</jk> MyResponseProcessor <jk>implements</jk>
ResponseProcessor {
+ *
+ * <ja>@Override</ja>
+ * <jk>public int</jk> process(RestCall <jv>call</jv>)
<jk>throws</jk> IOException {
+ *
+ * RestResponse <jv>res</jv> =
<jv>call</jv>.getRestResponse();
+ * Foo <jv>foo</jv> =
<jv>res</jv>.getOutput(Foo.<jk>class</jk>);
+ *
+ * <jk>if</jk> (<jv>foo</jv> ==
<jk>null</jk>)
+ * <jk>return</jk>
<jsf>NEXT</jsf>; <jc>// Let the next processor handle it.</jc>
+ *
+ * <jk>try</jk> (Writer <jv>w</jv> =
<jv>res</jv>.getNegotiatedWriter()) {
+ * <jc>//Pipe it to the writer
ourselves.</jc>
+ * }
+ *
+ * <jk>return</jk> <jsf>FINISHED</jsf>;
<jc>// We handled it.</jc>
+ * }
+ * }
+ * }
+ *
+ * <jc>// Option #1 - Defined via annotation.</jc>
+ *
<ja>@Rest</ja>(responseProcessors=MyResponseProcessor.<jk>class</jk>)
+ * <jk>public class</jk> MyResource {
+ *
+ * <jc>// Option #2 - Defined 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>.responseProcessors(MyResponseProcessor.<jk>class</jk>);
+ * }
+ *
+ * <jc>// Option #3 - Defined 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>.responseProcessors(MyResponseProcessors.<jk>class</jk>);
+ * }
+ *
+ * <ja>@RestGet</ja>(...)
+ * <jk>public</jk> Object myMethod() {
+ * <jc>// Return a special object for our
handler.</jc>
+ * <jk>return new</jk> MySpecialObject();
+ * }
+ * }
+ * </p>
+ *
+ * <ul class='notes'>
+ * <li>
+ * Response processors are always inherited from ascendant
resources.
+ * <li>
+ * When defined as a class, the implementation must have
one of the following constructors:
+ * <ul>
+ * <li><code><jk>public</jk> T(RestContext)</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>
+ *
+ * @return The builder for the {@link ResponseProcessorList} object in
the REST context.
+ */
+ public final ResponseProcessorList.Builder responseProcessors() {
+ if (responseProcessors == null)
+ responseProcessors =
createResponseProcessors(beanStore(), resource());
+ return responseProcessors;
+ }
+
+ /**
+ * Sets the builder for the {@link ResponseProcessorList} object in the
REST context.
+ *
+ * @param value The builder for the {@link ResponseProcessorList}
object in the REST context.
+ * @return This object.
+ * @throws RuntimeException If {@link #init(Object)} has not been
called.
+ */
+ public final RestContextBuilder
responseProcessors(ResponseProcessorList value) {
+ responseProcessors().impl(value);
+ return this;
+ }
+
+ /**
+ * Instantiates the response handlers for this REST resource.
+ *
+ * <p>
+ * Instantiates based on the following logic:
+ * <ul>
+ * <li>Looks for response processors set via any of the following:
+ * <ul>
+ * <li>{@link
RestContextBuilder#responseProcessors()}
+ * <li>{@link Rest#responseProcessors()}.
+ * </ul>
+ * <li>Looks for a static or non-static
<c>createResponseProcessors()</> method that returns <c>{@link
ResponseProcessor}[]</c> on the
+ * resource class with any of the following arguments:
+ * <ul>
+ * <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>ResponseProcessor[0]</c>.
+ * </ul>
+ *
+ * @param beanStore
+ * The factory used for creating beans and retrieving injected
beans.
+ * @param resource
+ * The REST servlet or bean that this context defines.
+ * @return The response handler builder for this REST resource.
+ */
+ protected ResponseProcessorList.Builder
createResponseProcessors(BeanStore beanStore, Supplier<?> resource) {
+
+ Value<ResponseProcessorList.Builder> v = Value.empty();
+ Object r = resource.get();
+
+ beanStore.getBean(ResponseProcessorList.Builder.class).map(x ->
x.copy()).ifPresent(x -> v.set(x));
+
+ if (v.isEmpty()) {
+ v.set(
+ ResponseProcessorList
+ .create()
+ .beanStore(beanStore)
+ .add(
+ ReaderProcessor.class,
+ InputStreamProcessor.class,
+ ThrowableProcessor.class,
+ HttpResponseProcessor.class,
+ HttpResourceProcessor.class,
+ HttpEntityProcessor.class,
+ ResponseBeanProcessor.class,
+ PlainTextPojoProcessor.class,
+ SerializedPojoProcessor.class
+ )
+ );
+ }
+
+ BeanStore
+ .of(beanStore, r)
+ .addBean(ResponseProcessorList.Builder.class, v.get())
+
.beanCreateMethodFinder(ResponseProcessorList.Builder.class, resource)
+ .find("createResponseProcessors")
+ .execute()
+ .ifPresent(x -> v.set(x));
+
+ beanStore.getBean(ResponseProcessorList.class).ifPresent(x ->
v.get().impl(x));
+
+ BeanStore
+ .of(beanStore, r)
+ .addBean(ResponseProcessorList.Builder.class, v.get())
+ .beanCreateMethodFinder(ResponseProcessorList.class,
resource)
+ .find("createResponseProcessors")
+ .execute()
+ .ifPresent(x -> v.get().impl(x));
+
+ return v.get();
+ }
+
+
+
//----------------------------------------------------------------------------------------------------
// Methods that give access to the config file, var resolver, and
properties.
//----------------------------------------------------------------------------------------------------
@@ -2463,115 +2635,6 @@ public class RestContextBuilder extends ContextBuilder
implements ServletConfig
}
/**
- * Response processors.
- *
- * <p>
- * Specifies a list of {@link ResponseProcessor} classes that know how
to convert POJOs returned by REST methods or
- * set via {@link RestResponse#setOutput(Object)} into appropriate HTTP
responses.
- *
- * <p>
- * By default, the following response handlers are provided in the
specified order:
- * <ul>
- * <li class='jc'>{@link ReaderProcessor}
- * <li class='jc'>{@link InputStreamProcessor}
- * <li class='jc'>{@link ThrowableProcessor}
- * <li class='jc'>{@link HttpResponseProcessor}
- * <li class='jc'>{@link HttpResourceProcessor}
- * <li class='jc'>{@link HttpEntityProcessor}
- * <li class='jc'>{@link ResponseBeanProcessor}
- * <li class='jc'>{@link PlainTextPojoProcessor}
- * <li class='jc'>{@link SerializedPojoProcessor}
- * </ul>
- *
- * <h5 class='section'>Example:</h5>
- * <p class='bcode w800'>
- * <jc>// Our custom response processor for Foo objects. </jc>
- * <jk>public class</jk> MyResponseProcessor <jk>implements</jk>
ResponseProcessor {
- *
- * <ja>@Override</ja>
- * <jk>public int</jk> process(RestCall <jv>call</jv>)
<jk>throws</jk> IOException {
- *
- * RestResponse <jv>res</jv> =
<jv>call</jv>.getRestResponse();
- * Foo <jv>foo</jv> =
<jv>res</jv>.getOutput(Foo.<jk>class</jk>);
- *
- * <jk>if</jk> (<jv>foo</jv> ==
<jk>null</jk>)
- * <jk>return</jk>
<jsf>NEXT</jsf>; <jc>// Let the next processor handle it.</jc>
- *
- * <jk>try</jk> (Writer <jv>w</jv> =
<jv>res</jv>.getNegotiatedWriter()) {
- * <jc>//Pipe it to the writer
ourselves.</jc>
- * }
- *
- * <jk>return</jk> <jsf>FINISHED</jsf>;
<jc>// We handled it.</jc>
- * }
- * }
- * }
- *
- * <jc>// Option #1 - Defined via annotation.</jc>
- *
<ja>@Rest</ja>(responseProcessors=MyResponseProcessor.<jk>class</jk>)
- * <jk>public class</jk> MyResource {
- *
- * <jc>// Option #2 - Defined 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>.responseProcessors(MyResponseProcessor.<jk>class</jk>);
- * }
- *
- * <jc>// Option #3 - Defined 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>.responseProcessors(MyResponseProcessors.<jk>class</jk>);
- * }
- *
- * <ja>@RestGet</ja>(...)
- * <jk>public</jk> Object myMethod() {
- * <jc>// Return a special object for our
handler.</jc>
- * <jk>return new</jk> MySpecialObject();
- * }
- * }
- * </p>
- *
- * <ul class='notes'>
- * <li>
- * Response processors are always inherited from ascendant
resources.
- * <li>
- * When defined as a class, the implementation must have
one of the following constructors:
- * <ul>
- * <li><code><jk>public</jk> T(RestContext)</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>
- *
- * @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 ResponseProcessor}.
- */
- @FluentSetter
- public RestContextBuilder responseProcessors(Class<?>...values) {
- responseProcessors.add(assertClassArrayArgIsType("values",
ResponseProcessor.class, values));
- return this;
- }
-
- /**
- * Response processors.
- *
- * <p>
- * Same as {@link #responseProcessors(Class...)} except input is
pre-constructed instances.
- *
- * @param values The values to add to this setting.
- * @return This object (for method chaining).
- */
- @FluentSetter
- public RestContextBuilder
responseProcessors(ResponseProcessor...values) {
- responseProcessors.append(values);
- return this;
- }
-
- /**
* REST children class.
*
* <p>
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
index ac4c0f6..4fca843 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
@@ -172,7 +172,7 @@ public final class RestResponse {
* </ul>
*
* <ul class='seealso'>
- * <li class='jm'>{@link
RestContextBuilder#responseProcessors(Class...)}
+ * <li class='jm'>{@link RestContextBuilder#responseProcessors()}
* <li class='link'>{@doc RestmReturnTypes}
* </ul>
*
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 6751339..4765ad2 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
@@ -1012,7 +1012,7 @@ public @interface Rest {
* set via {@link RestResponse#setOutput(Object)} into appropriate HTTP
responses.
*
* <ul class='seealso'>
- * <li class='jm'>{@link
RestContextBuilder#responseProcessors(Class...)}
+ * <li class='jm'>{@link RestContextBuilder#responseProcessors()}
* </ul>
*/
Class<? extends ResponseProcessor>[] responseProcessors() 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 18f9373..55157e4 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
@@ -1058,7 +1058,7 @@ public class RestAnnotation {
strings(a.defaultResponseHeaders()).map(x ->
stringHeader(x)).forEach(x -> b.defaultResponseHeaders(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.responseProcessors(a.responseProcessors());
+ b.responseProcessors().add(a.responseProcessors());
b.children((Object[])a.children());
b.restOpArgs(a.restOpArgs());
classes(a.encoders()).ifPresent(x ->
b.getEncoders().add(x));