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 e469f0e Context API refactoring.
e469f0e is described below
commit e469f0ec94e56c05e4586331c4e516afa444ecfc
Author: JamesBognar <[email protected]>
AuthorDate: Sun Sep 19 17:54:15 2021 -0400
Context API refactoring.
---
.../java/org/apache/juneau/rest/RestOpContext.java | 61 +------
.../apache/juneau/rest/RestOpContextBuilder.java | 203 +++++++++++----------
.../org/apache/juneau/rest/annotation/Rest.java | 2 +-
.../juneau/rest/annotation/RestAnnotation.java | 2 +-
.../apache/juneau/rest/annotation/RestDelete.java | 2 +-
.../rest/annotation/RestDeleteAnnotation.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 +-
14 files changed, 123 insertions(+), 165 deletions(-)
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 8ff1f87..b2ee601 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
@@ -52,7 +52,6 @@ import org.apache.juneau.parser.*;
import org.apache.juneau.reflect.*;
import org.apache.juneau.rest.annotation.*;
import org.apache.juneau.http.response.*;
-import org.apache.juneau.rest.guards.*;
import org.apache.juneau.rest.logging.*;
import org.apache.juneau.rest.util.*;
import org.apache.juneau.serializer.*;
@@ -153,8 +152,7 @@ public class RestOpContext extends Context implements
Comparable<RestOpContext>
partSerializer = bs.add(HttpPartSerializer.class,
builder.getPartSerializer().orElse(context.getPartSerializer()));
partParser = bs.add(HttpPartParser.class,
builder.getPartParser().orElse(context.getPartParser()));
converters = bs.add(RestConverter[].class,
builder.converters().build().asArray());
-
- guards = createGuards(r, builder, bs).asArray();
+ guards = bs.add(RestGuard[].class,
builder.getGuards().asArray());
RestMatcherList matchers = createMatchers(r, builder,
bs);
optionalMatchers = matchers.getOptionalEntries();
@@ -217,63 +215,6 @@ public class RestOpContext extends Context implements
Comparable<RestOpContext>
}
/**
- * Instantiates the guards for this REST resource method.
- *
- * <p>
- * Instantiates based on the following logic:
- * <ul>
- * <li>Looks for guards set via any of the following:
- * <ul>
- * <li>{@link
RestOpContextBuilder#guards(Class...)}/{@link
RestOpContextBuilder#guards(RestGuard...)}
- * <li>{@link RestOp#guards()}.
- * <li>{@link Rest#guards()}.
- * </ul>
- * <li>Looks for a static or non-static <c>createGuards()</>
method that returns <c>{@link RestGuard}[]</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>RestGuard[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 guards for this REST resource method.
- * @throws Exception If guards could not be instantiated.
- */
- protected RestGuardList createGuards(Object resource,
RestOpContextBuilder builder, BeanStore beanStore) throws Exception {
-
- RestGuardList.Builder x = builder.guards.beanStore(beanStore);
-
- Set<String> rolesDeclared = builder.rolesDeclared;
- Set<String> roleGuard =
ofNullable(builder.roleGuard).orElseGet(()->new LinkedHashSet<>());
-
- for (String rg : roleGuard) {
- try {
- x.append(new RoleBasedRestGuard(rolesDeclared,
rg));
- } catch (java.text.ParseException e1) {
- throw new ServletException(e1);
- }
- }
-
- x = BeanStore
- .of(beanStore, resource)
- .addBean(RestGuardList.Builder.class, x)
- .createMethodFinder(RestGuardList.Builder.class,
resource)
- .find("createGuards", Method.class)
- .thenFind("createGuards")
- .withDefault(x)
- .run();
-
- return x.build();
- }
-
- /**
* Instantiates the method matchers 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 1aec019..38160f8 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
@@ -14,6 +14,7 @@ package org.apache.juneau.rest;
import static java.util.Arrays.*;
import static org.apache.juneau.assertions.Assertions.*;
+import static org.apache.juneau.internal.ExceptionUtils.*;
import static org.apache.juneau.rest.HttpRuntimeException.*;
import static java.util.Optional.*;
@@ -36,6 +37,7 @@ import org.apache.juneau.parser.*;
import org.apache.juneau.reflect.*;
import org.apache.juneau.rest.annotation.*;
import org.apache.juneau.rest.converters.*;
+import org.apache.juneau.rest.guards.*;
import org.apache.juneau.serializer.*;
import org.apache.juneau.svl.*;
@@ -57,6 +59,12 @@ public class RestOpContextBuilder extends ContextBuilder {
private RestConverterList.Builder converters;
private BeanContextBuilder beanContext;
+ private RestGuardList.Builder guards;
+ private EncoderGroup.Builder encoders;
+ private SerializerGroup.Builder serializers;
+ private ParserGroup.Builder parsers;
+ private HttpPartSerializer.Creator partSerializer;
+ private HttpPartParser.Creator partParser;
PartList.Builder defaultFormData, defaultQueryData;
NamedAttributeList defaultRequestAttributes;
@@ -64,12 +72,6 @@ public class RestOpContextBuilder extends ContextBuilder {
RestMatcherList.Builder restMatchers;
List<MediaType> produces, consumes;
Set<String> roleGuard, rolesDeclared;
- RestGuardList.Builder guards = RestGuardList.create();
- EncoderGroup.Builder encoders;
- SerializerGroup.Builder serializers;
- ParserGroup.Builder parsers;
- HttpPartSerializer.Creator partSerializer;
- HttpPartParser.Creator partParser;
boolean dotAll;
Charset defaultCharset;
@@ -561,6 +563,108 @@ public class RestOpContextBuilder extends ContextBuilder {
return v.get();
}
+
//-----------------------------------------------------------------------------------------------------------------
+ // guards
+
//-----------------------------------------------------------------------------------------------------------------
+
+ /**
+ * Returns the builder for the {@link RestGuardList} object in the REST
context.
+ *
+ * @return The builder for the {@link RestGuardList} object in the REST
context.
+ */
+ public final RestGuardList.Builder guards() {
+ if (guards == null)
+ guards = createGuards(beanStore(), resource());
+ return guards;
+ }
+
+ /**
+ * Instantiates the guards for this REST resource method.
+ *
+ * <p>
+ * Instantiates based on the following logic:
+ * <ul>
+ * <li>Looks for guards set via any of the following:
+ * <ul>
+ * <li>{@link RestOpContextBuilder#guards()}}
+ * <li>{@link RestOp#guards()}.
+ * <li>{@link Rest#guards()}.
+ * </ul>
+ * <li>Looks for a static or non-static <c>createGuards()</>
method that returns <c>{@link RestGuard}[]</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>RestGuard[0]</c>.
+ * </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 RestGuardList.Builder createGuards(BeanStore beanStore,
Supplier<?> resource) {
+
+ // Default value.
+ Value<RestGuardList.Builder> v = Value.of(
+ RestGuardList
+ .create()
+ .beanStore(beanStore)
+ );
+
+ // Specify the implementation class if its set as a default.
+ defaultClasses()
+ .get(RestGuardList.class)
+ .ifPresent(x -> v.get().type(x));
+
+ // Replace with builder from bean store.
+ beanStore
+ .getBean(RestGuardList.Builder.class)
+ .map(x -> x.copy())
+ .ifPresent(x->v.set(x));
+
+ // Replace with bean from bean store.
+ beanStore
+ .getBean(RestGuardList.class)
+ .ifPresent(x->v.get().impl(x));
+
+ // Replace with builder from: public [static]
RestGuardList.Builder createGuards(<args>)
+ beanStore
+ .beanCreateMethodFinder(RestGuardList.Builder.class)
+ .addBean(RestGuardList.Builder.class, v.get())
+ .find("createGuards")
+ .run(x -> v.set(x));
+
+ // Replace with bean from: public [static] RestGuardList
createConverters(<args>)
+ beanStore
+ .beanCreateMethodFinder(RestGuardList.class)
+ .addBean(RestGuardList.Builder.class, v.get())
+ .find("createGuards")
+ .run(x -> v.get().impl(x));
+
+ return v.get();
+ }
+
+ final RestGuardList getGuards() {
+ RestGuardList.Builder b = guards();
+ Set<String> roleGuard =
ofNullable(this.roleGuard).orElseGet(()->new LinkedHashSet<>());
+
+ for (String rg : roleGuard) {
+ try {
+ b.append(new RoleBasedRestGuard(rolesDeclared,
rg));
+ } catch (java.text.ParseException e1) {
+ throw runtimeException(e1);
+ }
+ }
+
+ return guards.build();
+ }
+
/**
* When enabled, append <js>"/*"</js> to path patterns if not already
present.
*
@@ -872,93 +976,6 @@ public class RestOpContextBuilder extends ContextBuilder {
}
/**
- * Guards.
- *
- * <p>
- * Associates one or more {@link RestGuard RestGuards} with this method.
- *
- * <p>
- * If multiple guards are specified, <b>ALL</b> guards must pass.
- * <br>Note that this is different than matchers where only ONE matcher
needs to pass.
- *
- * <h5 class='section'>Example:</h5>
- * <p class='bcode w800'>
- * <jc>// Define a guard that only lets Billy make a request.</jc>
- * <jk>public</jk> BillyGuard <jk>extends</jk> RestGuard {
- * <ja>@Override</ja>
- * <jk>public boolean</jk> isRequestAllowed(RestRequest
<jv>req</jv>) {
- * <jk>return</jk>
<jv>req</jv>.getUserPrincipal().getName().equals(<js>"Billy"</js>);
- * }
- * }
- *
- * <jc>// Option #1 - Registered via annotation.</jc>
- * <ja>@Rest</ja>(guards={BillyGuard.<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>.guards(BillyGuard.<jk>class</jk>);
- * }
- *
- * <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>.guards(BillyGuard.<jk>class</jk>);
- * }
- *
- * <jc>// Override at the method level.</jc>
- *
<ja>@RestGet</ja>(guards={SomeOtherGuard.<jk>class</jk>})
- * <jk>public</jk> Object myMethod() {...}
- * }
- * </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(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>
- *
- * <ul class='seealso'>
- * <li class='link'>{@doc RestGuards}
- * <li class='ja'>{@link Rest#guards()}
- * <li class='ja'>{@link RestOp#guards()}
- * </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 RestGuard}.
- */
- @FluentSetter
- public RestOpContextBuilder guards(Class<?>...values) {
- guards.append(assertClassArrayArgIsType("values",
RestGuard.class, values));
- return this;
- }
-
- /**
- * Guards.
- *
- * <p>
- * Same as {@link #guards(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 guards(RestGuard...values) {
- guards.append(values);
- return this;
- }
-
- /**
* HTTP method name.
*
* <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 ad85cb9..fa75d39 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
@@ -698,7 +698,7 @@ public @interface Rest {
* Associates one or more {@link RestGuard RestGuards} with all REST
methods defined in this class.
*
* <ul class='seealso'>
- * <li class='jm'>{@link RestOpContextBuilder#guards(Class...)}
+ * <li class='jm'>{@link RestOpContextBuilder#guards()}
* </ul>
*/
Class<? extends RestGuard>[] guards() 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 ee2f9be..7fde14f 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
@@ -1124,7 +1124,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().append(a.converters());
- b.guards(a.guards());
+ b.guards().append(a.guards());
string(a.defaultCharset()).map(Charset::forName).ifPresent(x ->
b.defaultCharset(x));
string(a.maxInput()).ifPresent(x -> b.maxInput(x));
strings_cdl(a.rolesDeclared()).forEach(x ->
b.rolesDeclared(x));
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 bb39a14..a511440 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
@@ -366,7 +366,7 @@ public @interface RestDelete {
* Associates one or more {@link RestGuard RestGuards} with this method.
*
* <ul class='seealso'>
- * <li class='jm'>{@link RestOpContextBuilder#guards(Class...)}
+ * <li class='jm'>{@link RestOpContextBuilder#guards()}
* </ul>
*/
Class<? extends RestGuard>[] guards() 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 34b947b..b0dc4dd 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
@@ -476,7 +476,7 @@ public class RestDeleteAnnotation {
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.guards(a.guards());
+ b.guards().append(a.guards());
b.matchers(a.matchers());
string(a.clientVersion()).ifPresent(x ->
b.clientVersion(x));
string(a.defaultCharset()).map(Charset::forName).ifPresent(x ->
b.defaultCharset(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 3ad5a06..540e963 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
@@ -383,7 +383,7 @@ public @interface RestGet {
* Associates one or more {@link RestGuard RestGuards} with this method.
*
* <ul class='seealso'>
- * <li class='jm'>{@link RestOpContextBuilder#guards(Class...)}
+ * <li class='jm'>{@link RestOpContextBuilder#guards()}
* </ul>
*/
Class<? extends RestGuard>[] guards() 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 56a8ee1..4b2365b 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
@@ -536,7 +536,7 @@ public class RestGetAnnotation {
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().append(a.converters());
- b.guards(a.guards());
+ b.guards().append(a.guards());
b.matchers(a.matchers());
string(a.clientVersion()).ifPresent(x ->
b.clientVersion(x));
string(a.defaultCharset()).map(Charset::forName).ifPresent(x ->
b.defaultCharset(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 6b10682..be71dd4 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
@@ -439,7 +439,7 @@ public @interface RestOp {
* Associates one or more {@link RestGuard RestGuards} with this method.
*
* <ul class='seealso'>
- * <li class='jm'>{@link RestOpContextBuilder#guards(Class...)}
+ * <li class='jm'>{@link RestOpContextBuilder#guards()}
* </ul>
*/
Class<? extends RestGuard>[] guards() 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 1fc5bfd..38db134 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
@@ -643,7 +643,7 @@ public class RestOpAnnotation {
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().append(a.converters());
- b.guards(a.guards());
+ b.guards().append(a.guards());
b.matchers(a.matchers());
string(a.clientVersion()).ifPresent(x ->
b.clientVersion(x));
string(a.defaultCharset()).map(Charset::forName).ifPresent(x ->
b.defaultCharset(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 39e48cc..8f34f7b 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
@@ -440,7 +440,7 @@ public @interface RestPost {
* Associates one or more {@link RestGuard RestGuards} with this method.
*
* <ul class='seealso'>
- * <li class='jm'>{@link RestOpContextBuilder#guards(Class...)}
+ * <li class='jm'>{@link RestOpContextBuilder#guards()}
* </ul>
*/
Class<? extends RestGuard>[] guards() 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 33087ab..01ea83c 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
@@ -627,7 +627,7 @@ public class RestPostAnnotation {
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().append(a.converters());
- b.guards(a.guards());
+ b.guards().append(a.guards());
b.matchers(a.matchers());
string(a.clientVersion()).ifPresent(x ->
b.clientVersion(x));
string(a.defaultCharset()).map(Charset::forName).ifPresent(x ->
b.defaultCharset(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 8aed45b..057d5ee 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
@@ -440,7 +440,7 @@ public @interface RestPut {
* Associates one or more {@link RestGuard RestGuards} with this method.
*
* <ul class='seealso'>
- * <li class='jm'>{@link RestOpContextBuilder#guards(Class...)}
+ * <li class='jm'>{@link RestOpContextBuilder#guards()}
* </ul>
*/
Class<? extends RestGuard>[] guards() 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 8f9a327..725cc4b 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
@@ -627,7 +627,7 @@ public class RestPutAnnotation {
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().append(a.converters());
- b.guards(a.guards());
+ b.guards().append(a.guards());
b.matchers(a.matchers());
string(a.clientVersion()).ifPresent(x ->
b.clientVersion(x));
string(a.defaultCharset()).map(Charset::forName).ifPresent(x ->
b.defaultCharset(x));