# The Java EE 7 Tutorial

# 31.3 Subresources and Runtime Resource Resolution

You can use a resource class to process only a part of the URI request. A root resource can then implement subresources that can process the remainder of the URI path.

A resource class method that is annotated with `@Path` is either a subresource method or a subresource locator.

- A subresource method is used to handle requests on a subresource of the corresponding resource.

- A subresource locator is used to locate subresources of the corresponding resource.

## 31.3.1 Subresource Methods

A subresource method handles an HTTP request directly. The method must be annotated with a request method designator, such as `@GET` or `@POST`, in addition to `@Path`. The method is invoked for request URIs that match a URI template created by concatenating the URI template of the resource class with the URI template of the method.

The following code snippet shows how a subresource method can be used to extract the last name of an employee when the employee's email address is provided:

    @Path("/employeeinfo")
    public class EmployeeInfo {

        public employeeinfo() {}

        @GET
        @Path("/employees/{firstname}.{lastname}@{domain}.com")
        @Produces("text/xml")
        public String getEmployeeLastName(@PathParam("lastname") String lastName) {
           ...
        }
    }

The `getEmployeeLastName` method returns `doe` for the following `GET` request:

    GET /employeeinfo/employees/john.doe@example.com

## 31.3.2 Subresource Locators

A subresource locator returns an object that will handle an HTTP request. The method must not be annotated with a request method designator. You must declare a subresource locator within a subresource class, and only subresource locators are used for runtime resource resolution.

The following code snippet shows a subresource locator:

    // Root resource class
    @Path("/employeeinfo")
    public class EmployeeInfo {

        // Subresource locator: obtains the subresource Employee
        // from the path /employeeinfo/employees/{empid}
        @Path("/employees/{empid}")
        public Employee getEmployee(@PathParam("empid") String id) {
            // Find the Employee based on the id path parameter
            Employee emp = ...;
            ...
            return emp;
        }
    }

    // Subresource class
    public class Employee {

        // Subresource method: returns the employee's last name
        @GET
        @Path("/lastname")
        public String getEmployeeLastName() {
            ...
            return lastName;
        }
    }

In this code snippet, the `getEmployee` method is the subresource locator that provides the `Employee` object, which services requests for `lastname`.

If your HTTP request is `GET /employeeinfo/employees/as209/`, the `getEmployee` method returns an `Employee` object whose id is `as209`. At runtime, JAX-RS sends a `GET /employeeinfo/employees/as209/lastname` request to the `getEmployeeLastName` method. The `getEmployeeLastName` method retrieves and returns the last name of the employee whose id is `as209`.