# The Java EE 7 Tutorial

# 31.4 Integrating JAX-RS with EJB Technology and CDI

JAX-RS works with Enterprise JavaBeans technology (enterprise beans) and Contexts and Dependency Injection for Java EE (CDI).

In general, for JAX-RS to work with enterprise beans, you need to annotate the class of a bean with `@Path` to convert it to a root resource class. You can use the `@Path` annotation with stateless session beans and singleton POJO beans.

The following code snippet shows a stateless session bean and a singleton bean that have been converted to JAX-RS root resource classes.

    @Stateless
    @Path("stateless-bean")
    public class StatelessResource {...}

    @Singleton
    @Path("singleton-bean")
    public class SingletonResource {...}

Session beans can also be used for subresources.

JAX-RS and CDI have slightly different component models. By default, JAX-RS root resource classes are managed in the request scope, and no annotations are required for specifying the scope. CDI managed beans annotated with `@RequestScoped` or `@ApplicationScoped` can be converted to JAX-RS resource classes.

The following code snippet shows a JAX-RS resource class.

    @Path("/employee/{id}")
    public class Employee {
        public Employee(@PathParam("id") String id) {...}
    }

    @Path("{lastname}")
    public final class EmpDetails {...}

The following code snippet shows this JAX-RS resource class converted to a CDI bean. The beans must be proxyable, so the `Employee` class requires a nonprivate constructor with no parameters, and the `EmpDetails` class must not be `final`.

    @Path("/employee/{id}")
    @RequestScoped
    public class Employee {
        public Employee() {...}

        @Inject
        public Employee(@PathParam("id") String id) {...}
    }

    @Path("{lastname}")
    @RequestScoped
    public class EmpDetails {...}