Update the ApplicationPath, Path and Provider annotations to be stereotype annotations. Make the parameter annotations qualifiers. Added CDI as a required module.

Signed-off-by: James R. Perkins <jperkins@ibm.com>
diff --git a/jaxrs-api/pom.xml b/jaxrs-api/pom.xml
index 765f14b..522c6be 100644
--- a/jaxrs-api/pom.xml
+++ b/jaxrs-api/pom.xml
@@ -86,6 +86,14 @@
 
     <dependencies>
         <dependency>
+            <groupId>jakarta.enterprise</groupId>
+            <artifactId>jakarta.enterprise.cdi-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.inject</groupId>
+            <artifactId>jakarta.inject-api</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.junit.jupiter</groupId>
             <artifactId>junit-jupiter-api</artifactId>
             <scope>test</scope>
diff --git a/jaxrs-api/src/main/java/jakarta/ws/rs/ApplicationPath.java b/jaxrs-api/src/main/java/jakarta/ws/rs/ApplicationPath.java
index f4ef062..b5743c1 100644
--- a/jaxrs-api/src/main/java/jakarta/ws/rs/ApplicationPath.java
+++ b/jaxrs-api/src/main/java/jakarta/ws/rs/ApplicationPath.java
@@ -16,12 +16,17 @@
 
 package jakarta.ws.rs;
 
+import java.io.Serial;
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.inject.Stereotype;
+import jakarta.enterprise.util.AnnotationLiteral;
+
 /**
  * Identifies the application path that serves as the base URI for all resource URIs provided by
  * {@link jakarta.ws.rs.Path}. May only be applied to a subclass of {@link jakarta.ws.rs.core.Application}.
@@ -40,6 +45,8 @@
 @Documented
 @Target({ ElementType.TYPE })
 @Retention(RetentionPolicy.RUNTIME)
+@ApplicationScoped
+@Stereotype
 public @interface ApplicationPath {
 
     /**
@@ -55,4 +62,41 @@
      * @return base URI.
      */
     String value();
+
+    /**
+     * Supports inline instantiation of the {@link ApplicationPath} annotation.
+     *
+     * @since 5.0
+     */
+    final class Literal extends AnnotationLiteral<ApplicationPath> implements ApplicationPath {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * Default ApplicationPath literal
+         */
+        public static final ApplicationPath INSTANCE = of("");
+
+        private final String value;
+
+        private Literal(final String value) {
+            this.value = value;
+        }
+
+        /**
+         * Obtain the literal of a ApplicationPath annotation.
+         *
+         * @param value the base path value
+         *
+         * @return the new literal ApplicationPath
+         */
+        public static ApplicationPath of(final String value) {
+            return new Literal(value);
+        }
+
+        @Override
+        public String value() {
+            return value;
+        }
+    }
 }
diff --git a/jaxrs-api/src/main/java/jakarta/ws/rs/BeanParam.java b/jaxrs-api/src/main/java/jakarta/ws/rs/BeanParam.java
index 5c22a49..68f44c6 100644
--- a/jaxrs-api/src/main/java/jakarta/ws/rs/BeanParam.java
+++ b/jaxrs-api/src/main/java/jakarta/ws/rs/BeanParam.java
@@ -16,12 +16,16 @@
 
 package jakarta.ws.rs;
 
+import java.io.Serial;
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import jakarta.enterprise.util.AnnotationLiteral;
+import jakarta.inject.Qualifier;
+
 /**
  * The annotation that may be used to inject custom JAX-RS "parameter aggregator" value object into a resource class
  * field, property or resource method parameter.
@@ -68,5 +72,22 @@
 @Target({ ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD })
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
+@Qualifier
 public @interface BeanParam {
+
+    /**
+     * Supports inline instantiation of the {@link BeanParam} annotation.
+     * @since 5.0
+     */
+    final class Literal extends AnnotationLiteral<BeanParam> implements BeanParam {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * Default BeanParam literal
+         */
+        public static final BeanParam INSTANCE = new Literal();
+
+        private Literal() {}
+    }
 }
diff --git a/jaxrs-api/src/main/java/jakarta/ws/rs/CookieParam.java b/jaxrs-api/src/main/java/jakarta/ws/rs/CookieParam.java
index 8ec0326..1d8f247 100644
--- a/jaxrs-api/src/main/java/jakarta/ws/rs/CookieParam.java
+++ b/jaxrs-api/src/main/java/jakarta/ws/rs/CookieParam.java
@@ -16,12 +16,17 @@
 
 package jakarta.ws.rs;
 
+import java.io.Serial;
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import jakarta.enterprise.util.AnnotationLiteral;
+import jakarta.enterprise.util.Nonbinding;
+import jakarta.inject.Qualifier;
+
 /**
  * Binds the value of a HTTP cookie to a resource method parameter, resource class field, or resource class bean
  * property. A default value can be specified using the {@link DefaultValue} annotation.
@@ -55,6 +60,7 @@
 @Target({ ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD })
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
+@Qualifier
 public @interface CookieParam {
 
     /**
@@ -63,5 +69,43 @@
      *
      * @return HTTP cookie name.
      */
+    @Nonbinding
     String value();
+
+    /**
+     * Supports inline instantiation of the {@link CookieParam} annotation.
+     *
+     * @since 5.0
+     */
+    final class Literal extends AnnotationLiteral<CookieParam> implements CookieParam {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * Default CookieParam literal
+         */
+        public static final CookieParam INSTANCE = of("");
+
+        private final String value;
+
+        private Literal(final String value) {
+            this.value = value;
+        }
+
+        /**
+         * Obtain the literal of a CookieParam annotation.
+         *
+         * @param value the cookie value
+         *
+         * @return the new literal cookie param
+         */
+        public static CookieParam of(final String value) {
+            return new Literal(value);
+        }
+
+        @Override
+        public String value() {
+            return value;
+        }
+    }
 }
diff --git a/jaxrs-api/src/main/java/jakarta/ws/rs/FormParam.java b/jaxrs-api/src/main/java/jakarta/ws/rs/FormParam.java
index 1df6ae1..8285a49 100644
--- a/jaxrs-api/src/main/java/jakarta/ws/rs/FormParam.java
+++ b/jaxrs-api/src/main/java/jakarta/ws/rs/FormParam.java
@@ -16,12 +16,17 @@
 
 package jakarta.ws.rs;
 
+import java.io.Serial;
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import jakarta.enterprise.util.AnnotationLiteral;
+import jakarta.enterprise.util.Nonbinding;
+import jakarta.inject.Qualifier;
+
 /**
  * Binds the value(s) of a form parameter contained within a request entity body to a resource method parameter. Values
  * are URL decoded unless this is disabled using the {@link Encoded} annotation. A default value can be specified using
@@ -66,6 +71,7 @@
 @Target({ ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD })
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
+@Qualifier
 public @interface FormParam {
 
     /**
@@ -76,5 +82,43 @@
      *
      * @return form parameter name.
      */
+    @Nonbinding
     String value();
+
+    /**
+     * Supports inline instantiation of the {@link FormParam} annotation.
+     *
+     * @since 5.0
+     */
+    final class Literal extends AnnotationLiteral<FormParam> implements FormParam {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * Default FormParam literal
+         */
+        public static final FormParam INSTANCE = of("");
+
+        private final String value;
+
+        private Literal(final String value) {
+            this.value = value;
+        }
+
+        /**
+         * Obtain the literal of a FormParam annotation.
+         *
+         * @param value the form value
+         *
+         * @return the new literal form param
+         */
+        public static FormParam of(final String value) {
+            return new Literal(value);
+        }
+
+        @Override
+        public String value() {
+            return value;
+        }
+    }
 }
diff --git a/jaxrs-api/src/main/java/jakarta/ws/rs/HeaderParam.java b/jaxrs-api/src/main/java/jakarta/ws/rs/HeaderParam.java
index 2bdc640..c046055 100644
--- a/jaxrs-api/src/main/java/jakarta/ws/rs/HeaderParam.java
+++ b/jaxrs-api/src/main/java/jakarta/ws/rs/HeaderParam.java
@@ -16,12 +16,17 @@
 
 package jakarta.ws.rs;
 
+import java.io.Serial;
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import jakarta.enterprise.util.AnnotationLiteral;
+import jakarta.enterprise.util.Nonbinding;
+import jakarta.inject.Qualifier;
+
 /**
  * Binds the value(s) of a HTTP header to a resource method parameter, resource class field, or resource class bean
  * property. A default value can be specified using the {@link DefaultValue} annotation.
@@ -58,6 +63,7 @@
 @Target({ ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD })
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
+@Qualifier
 public @interface HeaderParam {
 
     /**
@@ -66,5 +72,43 @@
      *
      * @return HTTP header name.
      */
+    @Nonbinding
     String value();
+
+    /**
+     * Supports inline instantiation of the {@link HeaderParam} annotation.
+     *
+     * @since 5.0
+     */
+    final class Literal extends AnnotationLiteral<HeaderParam> implements HeaderParam {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * Default HeaderParam literal
+         */
+        public static final HeaderParam INSTANCE = of("");
+
+        private final String value;
+
+        private Literal(final String value) {
+            this.value = value;
+        }
+
+        /**
+         * Obtain the literal of a HeaderParam annotation.
+         *
+         * @param value the header value
+         *
+         * @return the new literal header param
+         */
+        public static HeaderParam of(final String value) {
+            return new Literal(value);
+        }
+
+        @Override
+        public String value() {
+            return value;
+        }
+    }
 }
diff --git a/jaxrs-api/src/main/java/jakarta/ws/rs/MatrixParam.java b/jaxrs-api/src/main/java/jakarta/ws/rs/MatrixParam.java
index 1abd05e..62a584d 100644
--- a/jaxrs-api/src/main/java/jakarta/ws/rs/MatrixParam.java
+++ b/jaxrs-api/src/main/java/jakarta/ws/rs/MatrixParam.java
@@ -16,12 +16,17 @@
 
 package jakarta.ws.rs;
 
+import java.io.Serial;
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import jakarta.enterprise.util.AnnotationLiteral;
+import jakarta.enterprise.util.Nonbinding;
+import jakarta.inject.Qualifier;
+
 /**
  * Binds the value(s) of a URI matrix parameter to a resource method parameter, resource class field, or resource class
  * bean property. Values are URL decoded unless this is disabled using the {@link Encoded} annotation. A default value
@@ -66,6 +71,7 @@
 @Target({ ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD })
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
+@Qualifier
 public @interface MatrixParam {
 
     /**
@@ -76,5 +82,43 @@
      *
      * @return URI matrix parameter name.
      */
+    @Nonbinding
     String value();
+
+    /**
+     * Supports inline instantiation of the {@link MatrixParam} annotation.
+     *
+     * @since 5.0
+     */
+    final class Literal extends AnnotationLiteral<MatrixParam> implements MatrixParam {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * Default MatrixParam literal
+         */
+        public static final MatrixParam INSTANCE = of("");
+
+        private final String value;
+
+        private Literal(final String value) {
+            this.value = value;
+        }
+
+        /**
+         * Obtain the literal of a MatrixParam annotation.
+         *
+         * @param value the matrix value
+         *
+         * @return the new literal matrix param
+         */
+        public static MatrixParam of(final String value) {
+            return new Literal(value);
+        }
+
+        @Override
+        public String value() {
+            return value;
+        }
+    }
 }
diff --git a/jaxrs-api/src/main/java/jakarta/ws/rs/Path.java b/jaxrs-api/src/main/java/jakarta/ws/rs/Path.java
index 5245dc6..2f72263 100644
--- a/jaxrs-api/src/main/java/jakarta/ws/rs/Path.java
+++ b/jaxrs-api/src/main/java/jakarta/ws/rs/Path.java
@@ -16,12 +16,17 @@
 
 package jakarta.ws.rs;
 
+import java.io.Serial;
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import jakarta.enterprise.context.RequestScoped;
+import jakarta.enterprise.inject.Stereotype;
+import jakarta.enterprise.util.AnnotationLiteral;
+
 /**
  * Identifies the URI path that a resource class or class method will serve requests for.
  *
@@ -65,6 +70,8 @@
 @Target({ ElementType.TYPE, ElementType.METHOD })
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
+@RequestScoped
+@Stereotype
 public @interface Path {
 
     /**
@@ -105,4 +112,41 @@
      * @return URI template.
      */
     String value();
+
+    /**
+     * Supports inline instantiation of the {@link Path} annotation.
+     *
+     * @since 5.0
+     */
+    final class Literal extends AnnotationLiteral<Path> implements Path {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * Default Path literal
+         */
+        public static final Path INSTANCE = of("");
+
+        private final String value;
+
+        private Literal(final String value) {
+            this.value = value;
+        }
+
+        /**
+         * Obtain the literal of a Path annotation.
+         *
+         * @param value the base path value
+         *
+         * @return the new literal Path
+         */
+        public static Path of(final String value) {
+            return new Literal(value);
+        }
+
+        @Override
+        public String value() {
+            return value;
+        }
+    }
 }
diff --git a/jaxrs-api/src/main/java/jakarta/ws/rs/PathParam.java b/jaxrs-api/src/main/java/jakarta/ws/rs/PathParam.java
index 93850e8..0b9775e 100644
--- a/jaxrs-api/src/main/java/jakarta/ws/rs/PathParam.java
+++ b/jaxrs-api/src/main/java/jakarta/ws/rs/PathParam.java
@@ -16,12 +16,17 @@
 
 package jakarta.ws.rs;
 
+import java.io.Serial;
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import jakarta.enterprise.util.AnnotationLiteral;
+import jakarta.enterprise.util.Nonbinding;
+import jakarta.inject.Qualifier;
+
 /**
  * Binds the value of a URI template parameter or a path segment containing the template parameter to a resource method
  * parameter, resource class field, or resource class bean property. The value is URL decoded unless this is disabled
@@ -67,6 +72,7 @@
 @Target({ ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD })
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
+@Qualifier
 public @interface PathParam {
 
     /**
@@ -80,5 +86,43 @@
      *
      * @return resource URI template parameter name.
      */
+    @Nonbinding
     String value();
+
+    /**
+     * Supports inline instantiation of the {@link PathParam} annotation.
+     *
+     * @since 5.0
+     */
+    final class Literal extends AnnotationLiteral<PathParam> implements PathParam {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * Default PathParam literal
+         */
+        public static final PathParam INSTANCE = of("");
+
+        private final String value;
+
+        private Literal(final String value) {
+            this.value = value;
+        }
+
+        /**
+         * Obtain the literal of a PathParam annotation.
+         *
+         * @param value the path value
+         *
+         * @return the new literal path param
+         */
+        public static PathParam of(final String value) {
+            return new Literal(value);
+        }
+
+        @Override
+        public String value() {
+            return value;
+        }
+    }
 }
diff --git a/jaxrs-api/src/main/java/jakarta/ws/rs/QueryParam.java b/jaxrs-api/src/main/java/jakarta/ws/rs/QueryParam.java
index 423258b..e737379 100644
--- a/jaxrs-api/src/main/java/jakarta/ws/rs/QueryParam.java
+++ b/jaxrs-api/src/main/java/jakarta/ws/rs/QueryParam.java
@@ -16,12 +16,17 @@
 
 package jakarta.ws.rs;
 
+import java.io.Serial;
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import jakarta.enterprise.util.AnnotationLiteral;
+import jakarta.enterprise.util.Nonbinding;
+import jakarta.inject.Qualifier;
+
 /**
  * Binds the value(s) of a HTTP query parameter to a resource method parameter, resource class field, or resource class
  * bean property. Values are URL decoded unless this is disabled using the {@link Encoded} annotation. A default value
@@ -60,6 +65,7 @@
 @Target({ ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD })
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
+@Qualifier
 public @interface QueryParam {
 
     /**
@@ -70,5 +76,43 @@
      *
      * @return HTTP query parameter name.
      */
+    @Nonbinding
     String value();
+
+    /**
+     * Supports inline instantiation of the {@link QueryParam} annotation.
+     *
+     * @since 5.0
+     */
+    final class Literal extends AnnotationLiteral<QueryParam> implements QueryParam {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * Default QueryParam literal
+         */
+        public static final QueryParam INSTANCE = of("");
+
+        private final String value;
+
+        private Literal(final String value) {
+            this.value = value;
+        }
+
+        /**
+         * Obtain the literal of a QueryParam annotation.
+         *
+         * @param value the query value
+         *
+         * @return the new literal query param
+         */
+        public static QueryParam of(final String value) {
+            return new Literal(value);
+        }
+
+        @Override
+        public String value() {
+            return value;
+        }
+    }
 }
diff --git a/jaxrs-api/src/main/java/jakarta/ws/rs/ext/Provider.java b/jaxrs-api/src/main/java/jakarta/ws/rs/ext/Provider.java
index b8d1ae7..15c0762 100644
--- a/jaxrs-api/src/main/java/jakarta/ws/rs/ext/Provider.java
+++ b/jaxrs-api/src/main/java/jakarta/ws/rs/ext/Provider.java
@@ -16,12 +16,17 @@
 
 package jakarta.ws.rs.ext;
 
+import java.io.Serial;
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.inject.Stereotype;
+import jakarta.enterprise.util.AnnotationLiteral;
+
 /**
  * Marks an implementation of an extension interface that should be discoverable by JAX-RS runtime during a provider
  * scanning phase.
@@ -33,5 +38,25 @@
 @Target({ ElementType.TYPE })
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
+@ApplicationScoped
+@Stereotype
 public @interface Provider {
+
+    /**
+     * Supports inline instantiation of the {@link Provider} annotation.
+     *
+     * @since 5.0
+     */
+    final class Literal extends AnnotationLiteral<Provider> implements Provider {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * Default Provider literal
+         */
+        public static final Provider INSTANCE = new Literal();
+
+        private Literal() {
+        }
+    }
 }
diff --git a/jaxrs-api/src/main/java/module-info.java b/jaxrs-api/src/main/java/module-info.java
index b0dd78b..4a659ae 100644
--- a/jaxrs-api/src/main/java/module-info.java
+++ b/jaxrs-api/src/main/java/module-info.java
@@ -20,6 +20,8 @@
 module jakarta.ws.rs {
 
     requires java.logging;
+    requires jakarta.cdi;
+    requires jakarta.inject;
 
     exports jakarta.ws.rs;
     exports jakarta.ws.rs.client;