Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

@ManagedProperty does not work in a CDI managed bean

I try to learn JSF and encountered on a problem connected with ManagedProperty. However I have tried to use it, it always failed - null exception pointer. What am I doing wrongly? I have read some "similar posts" on stackoverflow, but they did not helped to me. (I use GlassFish 4.0, JSF 2.2, JDK 1.7, Netbeans 7.3.1 (Java EE pack) and Java EE 6.0)

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
    <title>Facelet Title</title>
    </h:head>
    <h:body>
    Hello from Facelets
    <br/>
    User: #{books.user.name}<br/>
    1: #{param.pageId}<br/>
    2: #{books.pageId}<br/>
    <h:form>
        <h:inputText value="#{user.name}" /><br/>
        <h:inputText value="#{books.v1}" /><br/>
        <h:inputText value="#{books.v2}" /><br/>
        <h:inputText value="#{books.result}" /><br/>
        <h:commandButton value="dodaj" action="#{books.add}" />
    </h:form>
    </h:body>
</html>

Book

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tpsa.books.managed;

import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
import javax.faces.bean.ManagedProperty;

/**
 *
 * @author tomasz
 */
@Named(value = "books")
@RequestScoped
public class Books {

    private int v1;
    private int v2;
    private int result;
    @ManagedProperty(value = "#{user}")
    private User user;

    @ManagedProperty(value="#{param.pageId}")
    private int pageId;

    /**
     * Creates a new instance of Books
     */
    public Books() {
    }

    public void add() {
    result = v1 + v2;

    }

    public int getV1() {
    return v1;
    }

    public void setV1(int v1) {
    this.v1 = v1;
    }

    public int getV2() {
    return v2;
    }

    public void setV2(int v2) {
    this.v2 = v2;
    }

    public int getResult() {
    return result;
    }

    public void setResult(int result) {
    this.result = result;
    }

    public User getUser() {
    if (user == null) {
        System.err.println("WTF");
    }
    return user;
    }

    public void setUser(User user) {
    this.user = user;
    }

    public int getPageId() {
    return pageId;
    }

    public void setPageId(int pageId) {
    this.pageId = pageId;
    }



}

User

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tpsa.books.managed;

import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;

/**
 *
 * @author tomasz
 */
@Named(value = "user")
@SessionScoped
public class User implements Serializable {

    private String name;

    /**
     * Creates a new instance of User
     */
    public User() {
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }



}
like image 253
tpsa Avatar asked Jan 13 '23 00:01

tpsa


1 Answers

@ManagedProperty is managed bean annotaion, that can't be used with CDI. In above code, you used CDI bean i.e. @Named that is default in JSF 2.2. In this case you can't use ManagedProperty. Please read following line copied from Java EE docs of ManagedBean.

If this annotation is present on a class that does not have the ManagedBean annotation, the implementation must take no action on this annotation.

For details see the link:

http://docs.oracle.com/javaee/6/api/javax/faces/bean/ManagedProperty.html

So, use @Inject instead of @ManagedProperty for CDI bean.

@Inject
private User user;

Note that a getter/setter is unnecessary here.

like image 150
Masudul Avatar answered Jan 21 '23 08:01

Masudul