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 dea38a3 Context API refactoring.
dea38a3 is described below
commit dea38a30e4edc62345c9788a550b0308e1d8d790
Author: JamesBognar <[email protected]>
AuthorDate: Fri Sep 3 12:01:24 2021 -0400
Context API refactoring.
---
.../java/org/apache/juneau/rest/RestContext.java | 170 ++-------------------
.../org/apache/juneau/rest/RestContextBuilder.java | 148 +++++++++---------
.../org/apache/juneau/rest/annotation/Rest.java | 4 +-
.../juneau/rest/annotation/RestAnnotation.java | 8 +-
.../apache/juneau/rest/annotation/RestDelete.java | 4 +-
.../rest/annotation/RestDeleteAnnotation.java | 2 +-
.../org/apache/juneau/rest/annotation/RestGet.java | 4 +-
.../juneau/rest/annotation/RestGetAnnotation.java | 2 +-
.../org/apache/juneau/rest/annotation/RestOp.java | 4 +-
.../juneau/rest/annotation/RestOpAnnotation.java | 4 +-
.../apache/juneau/rest/annotation/RestPost.java | 4 +-
.../juneau/rest/annotation/RestPostAnnotation.java | 4 +-
.../org/apache/juneau/rest/annotation/RestPut.java | 4 +-
.../juneau/rest/annotation/RestPutAnnotation.java | 4 +-
14 files changed, 113 insertions(+), 253 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 f981ab6..6a2ebf7 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
@@ -149,146 +149,6 @@ public class RestContext extends BeanContext {
public static final String REST_beanStore = PREFIX + ".beanStore.o";
/**
- * Configuration property: Default request headers.
- *
- * <h5 class='section'>Property:</h5>
- * <ul class='spaced-list'>
- * <li><b>ID:</b> {@link
org.apache.juneau.rest.RestContext#REST_defaultRequestHeaders
REST_defaultRequestHeaders}
- * <li><b>Name:</b>
<js>"RestContext.defaultRequestHeaders.lo"</js>
- * <li><b>Data type:</b> <c>{@link org.apache.http.Header}[]</c>
- * <li><b>System property:</b>
<c>RestContext.defaultRequestHeaders</c>
- * <li><b>Environment variable:</b>
<c>RESTCONTEXT_DEFAULTREQUESTHEADERS</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#defaultRequestHeaders()}
- * <li class='ja'>{@link
org.apache.juneau.rest.annotation.RestOp#defaultRequestHeaders()}
- * </ul>
- * <li><b>Methods:</b>
- * <ul>
- * <li class='jm'>{@link
org.apache.juneau.rest.RestContextBuilder#defaultRequestHeader(String,String)}
- * <li class='jm'>{@link
org.apache.juneau.rest.RestContextBuilder#defaultRequestHeader(String,Supplier)}
- * <li class='jm'>{@link
org.apache.juneau.rest.RestContextBuilder#defaultRequestHeaders(org.apache.http.Header...)}
- * </ul>
- * </ul>
- *
- * <h5 class='section'>Description:</h5>
- * <p>
- * Specifies default values for request headers if they're not passed
in through the request.
- *
- * <ul class='notes'>
- * <li>
- * Affects values returned by {@link
RestRequest#getHeader(String)} when the header is not present on the request.
- * <li>
- * The most useful reason for this annotation is to
provide a default <c>Accept</c> header when one is not
- * specified so that a particular default {@link
Serializer} is picked.
- * </ul>
- *
- * <h5 class='section'>Example:</h5>
- * <p class='bcode w800'>
- * <jc>// Option #1 - Defined via annotation resolving to a config
file setting with default value.</jc>
- * <ja>@Rest</ja>(defaultRequestHeaders={<js>"Accept:
application/json"</js>, <js>"My-Header=$C{REST/myHeaderValue}"</js>})
- * <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>
- * .defaultRequestHeaders(
- *
Accept.<jsm>of</jsm>(<js>"application/json"</js>),
- *
BasicHeader.<jsm>of</jsm>(<js>"My-Header"</js>, <js>"foo"</js>)
- * );
- *
- * <jc>// Same, but using property.</jc>
- *
<jv>builder</jv>.appendTo(<jsf>REST_defaultRequestHeaders</jsf>,
Accept.<jsm>of</jsm>(<js>"application/json"</js>));
- * }
- *
- * <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>.defaultRequestHeaders(Accept.<jsm>of</jsm>(<js>"application/json"</js>));
- * }
- *
- * <jc>// Override at the method level.</jc>
- * <ja>@RestGet</ja>(defaultRequestHeaders={<js>"Accept:
text/xml"</js>})
- * <jk>public</jk> Object myMethod() {...}
- * }
- * </p>
- */
- public static final String REST_defaultRequestHeaders = PREFIX +
".defaultRequestHeaders.lo";
-
- /**
- * Configuration property: Default response headers.
- *
- * <h5 class='section'>Property:</h5>
- * <ul class='spaced-list'>
- * <li><b>ID:</b> {@link
org.apache.juneau.rest.RestContext#REST_defaultResponseHeaders
REST_defaultResponseHeaders}
- * <li><b>Name:</b>
<js>"RestContext.defaultResponseHeaders.lo"</js>
- * <li><b>Data type:</b> <c>{@link org.apache.http.Header}[]</c>
- * <li><b>System property:</b>
<c>RestContext.defaultResponseHeaders</c>
- * <li><b>Environment variable:</b>
<c>RESTCONTEXT_DEFAULTRESPONSEHEADERS</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#defaultResponseHeaders()}
- * <li class='ja'>{@link
org.apache.juneau.rest.annotation.RestOp#defaultResponseHeaders()}
- * </ul>
- * <li><b>Methods:</b>
- * <ul>
- * <li class='jm'>{@link
org.apache.juneau.rest.RestContextBuilder#defaultResponseHeader(String,String)}
- * <li class='jm'>{@link
org.apache.juneau.rest.RestContextBuilder#defaultResponseHeader(String,Supplier)}
- * <li class='jm'>{@link
org.apache.juneau.rest.RestContextBuilder#defaultResponseHeaders(org.apache.http.Header...)}
- * </ul>
- * </ul>
- *
- * <h5 class='section'>Description:</h5>
- * <p>
- * Specifies default values for response headers if they're not set
after the Java REST method is called.
- *
- * <ul class='notes'>
- * <li>
- * This is equivalent to calling {@link
RestResponse#setHeader(String, String)} programmatically in each of
- * the Java methods.
- * <li>
- * The header value will not be set if the header value
has already been specified (hence the 'default' in the name).
- * </ul>
- *
- * <h5 class='section'>Example:</h5>
- * <p class='bcode w800'>
- * <jc>// Option #1 - Defined via annotation resolving to a config
file setting with default value.</jc>
- * <ja>@Rest</ja>(defaultResponseHeaders={<js>"Content-Type:
$C{REST/defaultContentType,text/plain}"</js>,<js>"My-Header:
$C{REST/myHeaderValue}"</js>})
- * <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>
- * .defaultResponseHeaders(
- *
ContentType.<jsm>of</jsm>(<js>"text/plain"</js>),
- *
BasicHeader.<jsm>ofPair</jsm>(<js>"My-Header: foo"</js>)
- * );
- *
- * <jc>// Same, but using property.</jc>
- * <jv>builder</jv>
- * .appendTo(<jsf>REST_resHeaders</jsf>,
ContentType.<jsm>of</jsm>(<js>"text/plain"</js>))
- * .appendTo(<jsf>REST_resHeaders</jsf>,
BasicHeader.<jsm>of</jsm>(<js>"My-Header"</js>, <js>"foo"</js>));
- * }
- *
- * <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>.defaultResponseHeaders(ContentType.<jsm>of</jsm>(<js>"text/plain"</js>));
- * }
- * }
- * </p>
- */
- public static final String REST_defaultResponseHeaders = PREFIX +
".defaultResponseHeaders.lo";
-
- /**
* Configuration property: Compression encoders.
*
* <h5 class='section'>Property:</h5>
@@ -1332,8 +1192,8 @@ public class RestContext extends BeanContext {
staticFiles = createStaticFiles(r, cp, bf);
bf.addBean(StaticFiles.class, staticFiles);
- defaultRequestHeaders = createDefaultRequestHeaders(r,
cp, bf).build();
- defaultResponseHeaders =
createDefaultResponseHeaders(r, cp, bf).build();
+ defaultRequestHeaders = createDefaultRequestHeaders(r,
builder, bf).build();
+ defaultResponseHeaders =
createDefaultResponseHeaders(r, builder, bf).build();
defaultRequestAttributes =
createDefaultRequestAttributes(r, builder, bf);
opArgs = createOpArgs(r, builder, bf).asArray();
@@ -2723,20 +2583,17 @@ public class RestContext extends BeanContext {
*
* @param resource
* The REST servlet or bean that this context defines.
- * @param properties
- * The properties of this bean.
- * <br>Consists of all properties gathered through the builder and
annotations on this class and all parent classes.
+ * @param builder
+ * The builder for this object.
* @param beanStore
* The factory used for creating beans and retrieving injected
beans.
* <br>Created by {@link
#createBeanStore(Object,ContextProperties,RestContext)}.
* @return The default request headers for this REST object.
* @throws Exception If stack trace store could not be instantiated.
*/
- protected HeaderListBuilder createDefaultRequestHeaders(Object
resource, ContextProperties properties, BeanStore beanStore) throws Exception {
-
- HeaderListBuilder x = HeaderList.create();
+ protected HeaderListBuilder createDefaultRequestHeaders(Object
resource, RestContextBuilder builder, BeanStore beanStore) throws Exception {
- x.set(properties.getInstanceArray(REST_defaultRequestHeaders,
org.apache.http.Header.class, beanStore).orElse(new org.apache.http.Header[0]));
+ HeaderListBuilder x = builder.defaultRequestHeaders;
x = BeanStore
.of(beanStore, resource)
@@ -2754,20 +2611,17 @@ public class RestContext extends BeanContext {
*
* @param resource
* The REST servlet or bean that this context defines.
- * @param properties
- * The properties of this bean.
- * <br>Consists of all properties gathered through the builder and
annotations on this class and all parent classes.
+ * @param builder
+ * The builder for this object.
* @param beanStore
* The factory used for creating beans and retrieving injected
beans.
* <br>Created by {@link
#createBeanStore(Object,ContextProperties,RestContext)}.
* @return The default response headers for this REST object.
* @throws Exception If stack trace store could not be instantiated.
*/
- protected HeaderListBuilder createDefaultResponseHeaders(Object
resource, ContextProperties properties, BeanStore beanStore) throws Exception {
-
- HeaderListBuilder x = HeaderList.create();
+ protected HeaderListBuilder createDefaultResponseHeaders(Object
resource, RestContextBuilder builder, BeanStore beanStore) throws Exception {
- x.set(properties.getInstanceArray(REST_defaultResponseHeaders,
org.apache.http.Header.class, beanStore).orElse(new org.apache.http.Header[0]));
+ HeaderListBuilder x = builder.defaultResponseHeaders;
x = BeanStore
.of(beanStore, resource)
@@ -3881,7 +3735,7 @@ public class RestContext extends BeanContext {
* Returns the default request headers for this resource.
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultRequestHeaders}
+ * <li class='jm'>{@link
RestContextBuilder#defaultRequestHeaders(org.apache.http.Header...)}
* </ul>
*
* @return
@@ -3911,7 +3765,7 @@ public class RestContext extends BeanContext {
* Returns the default response headers for this resource.
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultResponseHeaders}
+ * <li class='jm'>{@link
RestContextBuilder#defaultResponseHeaders(org.apache.http.Header...)}
* </ul>
*
* @return
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 b930672..a72e2f7 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
@@ -138,6 +138,8 @@ public class RestContextBuilder extends BeanContextBuilder
implements ServletCon
BeanRef<RestLogger> callLogger = BeanRef.of(RestLogger.class);
BeanRef<DebugEnablement> debugEnablement =
BeanRef.of(DebugEnablement.class);
NamedAttributeList defaultRequestAttributes =
NamedAttributeList.create();
+ HeaderListBuilder defaultRequestHeaders = HeaderList.create();
+ HeaderListBuilder defaultResponseHeaders = HeaderList.create();
Enablement debugDefault, debug;
@@ -1313,51 +1315,55 @@ public class RestContextBuilder extends
BeanContextBuilder implements ServletCon
}
/**
- * <i><l>RestContext</l> configuration property: </i> Default
request headers.
+ * Default request headers.
*
* <p>
- * Adds a single default request header.
+ * Specifies default values for request headers if they're not passed
in through the request.
*
- * <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultRequestHeaders}
+ * <ul class='notes'>
+ * <li>
+ * Affects values returned by {@link
RestRequest#getHeader(String)} when the header is not present on the request.
+ * <li>
+ * The most useful reason for this annotation is to
provide a default <c>Accept</c> header when one is not
+ * specified so that a particular default {@link
Serializer} is picked.
* </ul>
*
- * @param name The HTTP header name.
- * @param value The HTTP header value.
- * @return This object (for method chaining).
- */
- @FluentSetter
- public RestContextBuilder defaultRequestHeader(String name, String
value) {
- return defaultRequestHeaders(stringHeader(name, value));
- }
-
- /**
- * <i><l>RestContext</l> configuration property: </i> Default
request headers.
+ * <h5 class='section'>Example:</h5>
+ * <p class='bcode w800'>
+ * <jc>// Option #1 - Defined via annotation resolving to a config
file setting with default value.</jc>
+ * <ja>@Rest</ja>(defaultRequestHeaders={<js>"Accept:
application/json"</js>, <js>"My-Header=$C{REST/myHeaderValue}"</js>})
+ * <jk>public class</jk> MyResource {
*
- * <p>
- * Adds a single default request header.
+ * <jc>// Option #2 - Defined via builder passed in
through resource constructor.</jc>
+ * <jk>public</jk> MyResource(RestContextBuilder
<jv>builder</jv>) <jk>throws</jk> Exception {
*
- * <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultRequestHeaders}
- * </ul>
+ * <jc>// Using method on builder.</jc>
+ * <jv>builder</jv>
+ * .defaultRequestHeaders(
+ *
Accept.<jsm>of</jsm>(<js>"application/json"</js>),
+ *
BasicHeader.<jsm>of</jsm>(<js>"My-Header"</js>, <js>"foo"</js>)
+ * );
+ * }
*
- * @param name The HTTP header name.
- * @param value The HTTP header value supplier.
- * @return This object (for method chaining).
- */
- @FluentSetter
- public RestContextBuilder defaultRequestHeader(String name,
Supplier<String> value) {
- return defaultRequestHeaders(stringHeader(name, value));
- }
-
- /**
- * <i><l>RestContext</l> configuration property: </i> Default
request headers.
+ * <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>.defaultRequestHeaders(Accept.<jsm>of</jsm>(<js>"application/json"</js>));
+ * }
*
- * <p>
- * Specifies default values for request headers if they're not passed
in through the request.
+ * <jc>// Override at the method level.</jc>
+ * <ja>@RestGet</ja>(defaultRequestHeaders={<js>"Accept:
text/xml"</js>})
+ * <jk>public</jk> Object myMethod() {...}
+ * }
+ * </p>
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultRequestHeaders}
+ * <li class='ja'>{@link Rest#defaultRequestHeaders}
+ * <li class='ja'>{@link RestOp#defaultRequestHeaders}
+ * <li class='ja'>{@link RestGet#defaultRequestHeaders}
+ * <li class='ja'>{@link RestPut#defaultRequestHeaders}
+ * <li class='ja'>{@link RestPost#defaultRequestHeaders}
+ * <li class='ja'>{@link RestDelete#defaultRequestHeaders}
* </ul>
*
* @param values The headers to add.
@@ -1365,56 +1371,56 @@ public class RestContextBuilder extends
BeanContextBuilder implements ServletCon
*/
@FluentSetter
public RestContextBuilder defaultRequestHeaders(Header...values) {
- asList(values).stream().forEach(x ->
appendTo(REST_defaultRequestHeaders, x));
+ defaultRequestHeaders.setDefault(values);
return this;
}
/**
- * <i><l>RestContext</l> configuration property: </i> Default
response headers.
+ * Default response headers.
*
* <p>
- * Adds a single default response header.
+ * Specifies default values for response headers if they're not set
after the Java REST method is called.
*
- * <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultResponseHeaders}
+ * <ul class='notes'>
+ * <li>
+ * This is equivalent to calling {@link
RestResponse#setHeader(String, String)} programmatically in each of
+ * the Java methods.
+ * <li>
+ * The header value will not be set if the header value
has already been specified (hence the 'default' in the name).
* </ul>
*
- * @param name The response header name.
- * @param value The response header value.
- * @return This object (for method chaining).
- */
- @FluentSetter
- public RestContextBuilder defaultResponseHeader(String name, String
value) {
- return defaultResponseHeaders(stringHeader(name, value));
- }
-
- /**
- * <i><l>RestContext</l> configuration property: </i> Default
response headers.
- *
- * <p>
- * Adds a single default response header.
+ * <h5 class='section'>Example:</h5>
+ * <p class='bcode w800'>
+ * <jc>// Option #1 - Defined via annotation resolving to a config
file setting with default value.</jc>
+ * <ja>@Rest</ja>(defaultResponseHeaders={<js>"Content-Type:
$C{REST/defaultContentType,text/plain}"</js>,<js>"My-Header:
$C{REST/myHeaderValue}"</js>})
+ * <jk>public class</jk> MyResource {
*
- * <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultResponseHeaders}
- * </ul>
+ * <jc>// Option #2 - Defined via builder passed in
through resource constructor.</jc>
+ * <jk>public</jk> MyResource(RestContextBuilder
<jv>builder</jv>) <jk>throws</jk> Exception {
*
- * @param name The response header name.
- * @param value The response header value supplier.
- * @return This object (for method chaining).
- */
- @FluentSetter
- public RestContextBuilder defaultResponseHeader(String name,
Supplier<String> value) {
- return defaultResponseHeaders(stringHeader(name, value));
- }
-
- /**
- * <i><l>RestContext</l> configuration property: </i> Default
response headers.
+ * <jc>// Using method on builder.</jc>
+ * <jv>builder</jv>
+ * .defaultResponseHeaders(
+ *
ContentType.<jsm>of</jsm>(<js>"text/plain"</js>),
+ *
BasicHeader.<jsm>ofPair</jsm>(<js>"My-Header: foo"</js>)
+ * );
+ * }
*
- * <p>
- * Specifies default values for response headers if they're not set
after the Java REST method is called.
+ * <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>.defaultResponseHeaders(ContentType.<jsm>of</jsm>(<js>"text/plain"</js>));
+ * }
+ * }
+ * </p>
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultResponseHeaders}
+ * <li class='ja'>{@link Rest#defaultResponseHeaders}
+ * <li class='ja'>{@link RestOp#defaultResponseHeaders}
+ * <li class='ja'>{@link RestGet#defaultResponseHeaders}
+ * <li class='ja'>{@link RestPut#defaultResponseHeaders}
+ * <li class='ja'>{@link RestPost#defaultResponseHeaders}
+ * <li class='ja'>{@link RestDelete#defaultResponseHeaders}
* </ul>
*
* @param values The headers to add.
@@ -1422,7 +1428,7 @@ public class RestContextBuilder extends
BeanContextBuilder implements ServletCon
*/
@FluentSetter
public RestContextBuilder defaultResponseHeaders(Header...values) {
- asList(values).stream().forEach(x ->
appendTo(REST_defaultResponseHeaders, x));
+ defaultResponseHeaders.setDefault(values);
return this;
}
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 ae9819f..46c86a9 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
@@ -574,7 +574,7 @@ public @interface Rest {
* </ul>
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultRequestHeaders}
+ * <li class='jm'>{@link
RestContextBuilder#defaultRequestHeaders(org.apache.http.Header...)}
* </ul>
*/
String[] defaultRequestHeaders() default {};
@@ -592,7 +592,7 @@ public @interface Rest {
* </ul>
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultResponseHeaders}
+ * <li class='jm'>{@link
RestContextBuilder#defaultResponseHeaders(org.apache.http.Header...)}
* </ul>
*/
String[] defaultResponseHeaders() 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 d50e2af..b7b98ac 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
@@ -1046,10 +1046,10 @@ public class RestAnnotation {
stringStream(a.produces()).map(MediaType::of).forEach(x
-> b.produces(x));
stringStream(a.consumes()).map(MediaType::of).forEach(x
-> b.consumes(x));
stringStream(a.defaultRequestAttributes()).map(x ->
BasicNamedAttribute.ofPair(x)).forEach(x -> b.defaultRequestAttributes(x));
- stringStream(a.defaultRequestHeaders()).map(x ->
stringHeader(x)).forEach(x -> b.appendTo(REST_defaultRequestHeaders, x));
- stringStream(a.defaultResponseHeaders()).map(x ->
stringHeader(x)).forEach(x -> b.appendTo(REST_defaultResponseHeaders, x));
- b.appendToIfNotEmpty(REST_defaultRequestHeaders,
accept(string(a.defaultAccept())));
- b.appendToIfNotEmpty(REST_defaultRequestHeaders,
contentType(string(a.defaultContentType())));
+ stringStream(a.defaultRequestHeaders()).map(x ->
stringHeader(x)).forEach(x -> b.defaultRequestHeaders(x));
+ stringStream(a.defaultResponseHeaders()).map(x ->
stringHeader(x)).forEach(x -> b.defaultResponseHeaders(x));
+ value(a.defaultAccept()).map(x ->
accept(x)).ifPresent(x -> b.defaultRequestHeaders(x));
+ value(a.defaultContentType()).map(x ->
contentType(x)).ifPresent(x -> b.defaultRequestHeaders(x));
b.responseProcessors(a.responseProcessors());
b.children((Object[])a.children());
b.restOpArgs(a.restOpArgs());
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestDelete.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestDelete.java
index 1f230c1..d5e0f93 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestDelete.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestDelete.java
@@ -260,7 +260,7 @@ public @interface RestDelete {
* </ul>
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultRequestHeaders}
+ * <li class='jm'>{@link
RestContextBuilder#defaultRequestHeaders(org.apache.http.Header...)}
* </ul>
*/
String[] defaultRequestHeaders() default {};
@@ -285,7 +285,7 @@ public @interface RestDelete {
* </ul>
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultResponseHeaders}
+ * <li class='jm'>{@link
RestContextBuilder#defaultResponseHeaders(org.apache.http.Header...)}
* </ul>
*/
String[] defaultResponseHeaders() default {};
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestDeleteAnnotation.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestDeleteAnnotation.java
index 6ef318f..fc815fd 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestDeleteAnnotation.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestDeleteAnnotation.java
@@ -462,7 +462,7 @@ public class RestDeleteAnnotation {
stringStream(a.defaultResponseHeaders()).map(x ->
stringHeader(x)).forEach(x -> b.defaultResponseHeaders(x));
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())));
+ value(a.defaultAccept()).map(x ->
accept(x)).ifPresent(x -> b.defaultRequestHeaders(x));
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/RestGet.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestGet.java
index 6c87023..1ce1962 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
@@ -275,7 +275,7 @@ public @interface RestGet {
* </ul>
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultRequestHeaders}
+ * <li class='jm'>{@link
RestContextBuilder#defaultRequestHeaders(org.apache.http.Header...)}
* </ul>
*/
String[] defaultRequestHeaders() default {};
@@ -300,7 +300,7 @@ public @interface RestGet {
* </ul>
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultResponseHeaders}
+ * <li class='jm'>{@link
RestContextBuilder#defaultResponseHeaders(org.apache.http.Header...)}
* </ul>
*/
String[] defaultResponseHeaders() 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 b2d4016..0be1fae 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
@@ -518,7 +518,7 @@ public class RestGetAnnotation {
stringStream(a.defaultResponseHeaders()).map(x ->
stringHeader(x)).forEach(x -> b.defaultResponseHeaders(x));
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())));
+ value(a.defaultAccept()).map(x ->
accept(x)).ifPresent(x -> b.defaultRequestHeaders(x));
b.converters(a.converters());
b.guards(a.guards());
b.matchers(a.matchers());
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 be19d0b..24adede 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
@@ -330,7 +330,7 @@ public @interface RestOp {
* </ul>
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultRequestHeaders}
+ * <li class='jm'>{@link
RestContextBuilder#defaultRequestHeaders(org.apache.http.Header...)}
* </ul>
*/
String[] defaultRequestHeaders() default {};
@@ -355,7 +355,7 @@ public @interface RestOp {
* </ul>
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultResponseHeaders}
+ * <li class='jm'>{@link
RestContextBuilder#defaultResponseHeaders(org.apache.http.Header...)}
* </ul>
*/
String[] defaultResponseHeaders() 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 102f6ae..2309d70 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
@@ -621,8 +621,8 @@ public class RestOpAnnotation {
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));
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())));
+ value(a.defaultAccept()).map(x ->
accept(x)).ifPresent(x -> b.defaultRequestHeaders(x));
+ value(a.defaultContentType()).map(x ->
contentType(x)).ifPresent(x -> b.defaultRequestHeaders(x));
b.converters(a.converters());
b.guards(a.guards());
b.matchers(a.matchers());
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 aa53e3c..7572e09 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
@@ -332,7 +332,7 @@ public @interface RestPost {
* </ul>
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultRequestHeaders}
+ * <li class='jm'>{@link
RestContextBuilder#defaultRequestHeaders(org.apache.http.Header...)}
* </ul>
*/
String[] defaultRequestHeaders() default {};
@@ -357,7 +357,7 @@ public @interface RestPost {
* </ul>
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultResponseHeaders}
+ * <li class='jm'>{@link
RestContextBuilder#defaultResponseHeaders(org.apache.http.Header...)}
* </ul>
*/
String[] defaultResponseHeaders() 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 cb329c7..f1e84f3 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
@@ -606,8 +606,8 @@ public class RestPostAnnotation {
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));
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())));
+ value(a.defaultAccept()).map(x ->
accept(x)).ifPresent(x -> b.defaultRequestHeaders(x));
+ value(a.defaultContentType()).map(x ->
contentType(x)).ifPresent(x -> b.defaultRequestHeaders(x));
b.converters(a.converters());
b.guards(a.guards());
b.matchers(a.matchers());
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 f799e79..8915b6d 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
@@ -332,7 +332,7 @@ public @interface RestPut {
* </ul>
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultRequestHeaders}
+ * <li class='jm'>{@link
RestContextBuilder#defaultRequestHeaders(org.apache.http.Header...)}
* </ul>
*/
String[] defaultRequestHeaders() default {};
@@ -357,7 +357,7 @@ public @interface RestPut {
* </ul>
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_defaultResponseHeaders}
+ * <li class='jm'>{@link
RestContextBuilder#defaultResponseHeaders(org.apache.http.Header...)}
* </ul>
*/
String[] defaultResponseHeaders() 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 46fd32b..e759440 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
@@ -606,8 +606,8 @@ public class RestPutAnnotation {
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));
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())));
+ value(a.defaultAccept()).map(x ->
accept(x)).ifPresent(x -> b.defaultRequestHeaders(x));
+ value(a.defaultContentType()).map(x ->
contentType(x)).ifPresent(x -> b.defaultRequestHeaders(x));
b.converters(a.converters());
b.guards(a.guards());
b.matchers(a.matchers());