# The Java EE 7 Tutorial

# 26.2 The producermethods Example: Using a Producer Method to Choose a Bean Implementation

The `producermethods` example shows how to use a producer method to choose between two beans at runtime, as described in Using Producer Methods, Producer Fields, and Disposer Methods in CDI Applications. It is very similar to the `encoder` example described in The encoder Example: Using Alternatives. The example includes the same interface and two implementations of it, a managed bean, a Facelets page, and configuration files. It also contains a qualifier type. When you run it, you do not need to edit the `beans.xml` file and redeploy the application to change its behavior.

## 26.2.1 Components of the producermethods Example

The components of `producermethods` are very much like those for `encoder`, with some significant differences.

Neither implementation of the `Coder` bean is annotated `@Alternative`, and there is no `beans.xml` file, because it is not needed.

The Facelets page and the managed bean, `CoderBean`, have an additional property, `coderType`, that allows the user to specify at runtime which implementation to use. In addition, the managed bean has a producer method that selects the implementation using a qualifier type, `@Chosen`.

The bean declares two constants that specify whether the coder type is the test implementation or the implementation that actually shifts letters:

        private final static int TEST = 1;
        private final static int SHIFT = 2;
        private int coderType = SHIFT; // default value

The producer method, annotated with `@Produces` and `@Chosen` as well as `@RequestScoped` (so that it lasts only for the duration of a single request and response), returns one of the two implementations based on the `coderType` supplied by the user.

        @Produces
        @Chosen
        @RequestScoped
        public Coder getCoder() {

            switch (coderType) {
                case TEST:
                    return new TestCoderImpl();
                case SHIFT:
                    return new CoderImpl();
                default:
                    return null;
            }
        }

Finally, the managed bean injects the chosen implementation, specifying the same qualifier as that returned by the producer method to resolve ambiguities:

        @Inject
        @Chosen
        @RequestScoped
        Coder coder;

The Facelets page contains modified instructions and a pair of options whose selected value is assigned to the property `coderBean.coderType`:

        <h2>String Encoder</h2>
            <p>Select Test or Shift, type a string and an integer, then click
                Encode.</p>
            <p>If you select Test, the TestCoderImpl bean will display the
                argument values.</p>
            <p>If you select Shift, the CoderImpl bean will return a string that
                shifts the letters in the original string by the value you specify.
                The value must be between 0 and 26.</p>
            <h:form id="encodeit">
                <h:selectOneRadio id="coderType"
                                  required="true"
                                  value="#{coderBean.coderType}">
                    <f:selectItem
                        itemValue="1"
                        itemLabel="Test"/>
                    <f:selectItem
                        itemValue="2"
                        itemLabel="Shift Letters"/>
                </h:selectOneRadio>
                ...

## 26.2.2 Running the producermethods Example

You can use either NetBeans IDE or Maven to build, package, deploy, and run the `producermethods` application.

### 26.2.2.1 To Build, Package, and Deploy the producermethods Example Using NetBeans IDE

1. Make sure that GlassFish Server has been started (see Starting and Stopping GlassFish Server).

2. From the File menu, choose Open Project.

3. In the Open Project dialog box, navigate to:

       tut-install/examples/cdi

4. Select the `producermethods` folder.

5. Click Open Project.

6. In the Projects tab, right-click the `producermethods` project and select Build.

   This command builds and packages the application into a WAR file, `producermethods.war`, located in the `target` directory, and then deploys it to GlassFish Server.

### 26.2.2.2 To Build, Package, and Deploy the producermethods Example Using Maven

1. Make sure that GlassFish Server has been started (see Starting and Stopping GlassFish Server).

2. In a terminal window, go to:

       tut-install/examples/cdi/producermethods/

3. Enter the following command to deploy the application:

       mvn install

   This command builds and packages the application into a WAR file, `producermethods.war`, located in the `target` directory, and then deploys it to GlassFish Server.

### 26.2.2.3 To Run the producermethods Example

1. In a web browser, enter the following URL:

       http://localhost:8080/producermethods

2. On the String Encoder page, select either the Test or Shift Letters option, enter a string and the number of letters to shift by, and then click Encode.

   Depending on your selection, the Result line displays either the encoded string or the input values you specified.